require "ipc/json"
require "grok"

class DNSManager::Request

	IPC::JSON.message NewDomain, 9 do
		property domain : String

		def initialize(@domain)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user

			dnsmanagerd.storage.new_domain user.uid, @domain
		end
	end
	DNSManager.requests << NewDomain

	IPC::JSON.message DeleteDomain, 10 do
		property domain : String

		def initialize(@domain)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			dnsmanagerd.storage.delete_domain user.uid, @domain
		end
	end
	DNSManager.requests << DeleteDomain

	IPC::JSON.message AddOrUpdateZone, 11 do
		property zone : DNSManager::Storage::Zone

		def initialize(@zone)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			dnsmanagerd.storage.add_or_update_zone user.uid, zone
		end
	end
	DNSManager.requests << AddOrUpdateZone

	IPC::JSON.message GetZone, 12 do
		property domain : String

		def initialize(@domain)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			dnsmanagerd.storage.get_zone user.uid, @domain
		end
	end
	DNSManager.requests << GetZone

	IPC::JSON.message UserDomains, 13 do
		def initialize()
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			user_domain_names = dnsmanagerd.storage.user_domains(user.uid).map &.name
			Response::DomainList.new user_domain_names
		end
	end
	DNSManager.requests << UserDomains

	IPC::JSON.message AddRR, 14 do
		property domain : String
		property rr : DNSManager::Storage::Zone::ResourceRecord

		def initialize(@domain, @rr)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			dnsmanagerd.storage.add_rr user.uid, @domain, @rr
		end
	end
	DNSManager.requests << AddRR

	IPC::JSON.message UpdateRR, 15 do
		property domain : String
		property rr : DNSManager::Storage::Zone::ResourceRecord

		def initialize(@domain, @rr)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			dnsmanagerd.storage.update_rr user.uid, @domain, @rr
		end
	end
	DNSManager.requests << UpdateRR

	IPC::JSON.message DeleteRR, 16 do
		property domain : String
		property rrid : UInt32

		def initialize(@domain, @rrid)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			dnsmanagerd.storage.delete_rr user.uid, @domain, @rrid
		end
	end
	DNSManager.requests << DeleteRR

	IPC::JSON.message AskGeneratedZoneFile, 17 do
		property domain : String

		def initialize(@domain)
		end

		def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
			user = dnsmanagerd.get_logged_user event
			return Response::ErrorUserNotLogged.new unless user
			dnsmanagerd.storage.get_generated_zonefile user.uid, @domain
		end
	end
	DNSManager.requests << AskGeneratedZoneFile
end