#pragma once
#include "BitStream.h"
#include "RakNetTypes.h"
#include "dCommonVars.h"

class Entity;

namespace Mail {
	enum class MailMessageID {
		Send = 0x00,
		SendResponse = 0x01,
		DataRequest = 0x03,
		MailData = 0x04,
		AttachmentCollect = 0x05,
		AttachmentCollectConfirm = 0x06,
		MailDelete = 0x07,
		MailDeleteConfirm = 0x08,
		MailRead = 0x09,
		MailReadConfirm = 0x0a,
		NotificationRequest = 0x0b
	};

	enum class MailSendResponse {
		Success = 0,
		NotEnoughCoins,
		AttachmentNotFound,
		ItemCannotBeMailed,
		CannotMailSelf,
		RecipientNotFound,
		DifferentFaction,
		Unknown,
		ModerationFailure,
		AccountIsMuted,
		UnknownFailure,
		RecipientIsIgnored,
		UnknownFailure3,
		RecipientIsFTP
	};

	const std::string ServerName = "Darkflame Universe";

	void SendMail(
		const Entity* recipient,
		const std::string& subject,
		const std::string& body,
		LOT attachment,
		uint16_t attachmentCount
	);

	void SendMail(
		LWOOBJID recipient,
		const std::string& recipientName,
		const std::string& subject,
		const std::string& body,
		LOT attachment,
		uint16_t attachmentCount,
		const SystemAddress& sysAddr
	);

	void SendMail(
		LWOOBJID sender,
		const std::string& senderName,
		const Entity* recipient,
		const std::string& subject,
		const std::string& body,
		LOT attachment,
		uint16_t attachmentCount
	);

	void SendMail(
		LWOOBJID sender,
		const std::string& senderName,
		LWOOBJID recipient,
		const std::string& recipientName,
		const std::string& subject,
		const std::string& body,
		LOT attachment,
		uint16_t attachmentCount,
		const SystemAddress& sysAddr
	);

	void HandleMailStuff(RakNet::BitStream* packet, const SystemAddress& sysAddr, Entity* entity);
	void HandleSendMail(RakNet::BitStream* packet, const SystemAddress& sysAddr, Entity* entity);
	void HandleDataRequest(RakNet::BitStream* packet, const SystemAddress& sysAddr, Entity* player);
	void HandleAttachmentCollect(RakNet::BitStream* packet, const SystemAddress& sysAddr, Entity* player);
	void HandleMailDelete(RakNet::BitStream* packet, const SystemAddress& sysAddr);
	void HandleMailRead(RakNet::BitStream* packet, const SystemAddress& sysAddr);
	void HandleNotificationRequest(const SystemAddress& sysAddr, uint32_t objectID);

	void SendSendResponse(const SystemAddress& sysAddr, MailSendResponse response);
	void SendNotification(const SystemAddress& sysAddr, int mailCount);
	void SendAttachmentRemoveConfirm(const SystemAddress& sysAddr, uint64_t mailID);
	void SendDeleteConfirm(const SystemAddress& sysAddr, uint64_t mailID, LWOOBJID playerID);
	void SendReadConfirm(const SystemAddress& sysAddr, uint64_t mailID);
};