using PSO2SERVER.Models;

namespace PSO2SERVER.Packets.PSOPackets
{
    public class CharacterSpawnPacket : Packet
    {
        private readonly Character _character;
        public bool IsItMe = true;
        public PSOLocation Position;

        public CharacterSpawnPacket(Character character, PSOLocation locatiion)
        {
            _character = character;
            Position = locatiion;
        }

        public CharacterSpawnPacket(Character character, PSOLocation locatiion, bool isme)
        {
            _character = character;
            IsItMe = isme;
            Position = locatiion;
        }

        #region implemented abstract members of Packet

        public override byte[] Build()
        {
            var writer = new PacketWriter();

            // Player header
            writer.WritePlayerHeader((uint) _character.Player.PlayerId);

            // Spawn position
            writer.Write(Position);

            writer.Write((ushort) 0); // padding?
            writer.WriteFixedLengthASCII("Character", 32);
            writer.Write((ushort) 1); // 0x44
            writer.Write((ushort) 0); // 0x46
            writer.Write((uint) 602); // 0x48
            writer.Write((uint) 1); // 0x4C
            writer.Write((uint) 53); // 0x50
            writer.Write((uint) 0); // 0x54
            writer.Write((uint) (IsItMe ? 47 : 39)); // 0x58
            writer.Write((ushort) 559); // 0x5C
            writer.Write((ushort) 306); // 0x5E
            writer.Write((uint) _character.Player.PlayerId); // player ID copy
            writer.Write((uint) 0); // "char array ugggghhhhh" according to PolarisLegacy
            writer.Write((uint) 0); // "voiceParam_unknown4"
            writer.Write((uint) 0); // "voiceParam_unknown8"
            writer.WriteFixedLengthUtf16(_character.Name, 16);
            writer.Write((uint) 0); // 0x90
            writer.WriteStruct(_character.Looks);
            writer.WriteStruct(_character.Jobs);
            writer.WriteFixedLengthUtf16("", 32); // title?
            writer.Write((uint) 0); // 0x204
            writer.Write((uint) 0); // gmflag?
            writer.WriteFixedLengthUtf16(_character.Player.Nickname, 16); // nickname, maybe not 16 chars?
            for (var i = 0; i < 64; i++)
                writer.Write((byte) 0);

            return writer.ToArray();
        }

        public override PacketHeader GetHeader()
        {
            return new PacketHeader(0x08, 0x04);
        }

        #endregion
    }
}