using FSO.Common.Serialization;
using Mina.Core.Buffer;
using System.Collections.Generic;

namespace FSO.Server.Protocol.Electron.Packets
{
    public class NhoodCandidateList : AbstractElectronPacket
    {
        public bool NominationMode;
        public List<NhoodCandidate> Candidates;

        public override void Deserialize(IoBuffer input, ISerializationContext context)
        {
            NominationMode = input.GetBool();
            int candCount = input.GetInt32();

            Candidates = new List<NhoodCandidate>();
            for (int i=0; i<candCount; i++)
            {
                var candidate = new NhoodCandidate()
                {
                    ID = input.GetUInt32(),
                    Name = input.GetPascalVLCString(),
                    Rating = input.GetUInt32()
                };

                if (!NominationMode)
                {
                    candidate.LastNhoodName = input.GetPascalVLCString();
                    candidate.LastNhoodID = input.GetUInt32();
                    candidate.TermNumber = input.GetUInt32();
                    candidate.Message = input.GetPascalVLCString();
                }
                Candidates.Add(candidate);
            }
        }

        public override ElectronPacketType GetPacketType()
        {
            return ElectronPacketType.NhoodCandidateList;
        }

        public override void Serialize(IoBuffer output, ISerializationContext context)
        {
            output.PutBool(NominationMode);
            output.PutInt32(Candidates.Count);

            foreach (var candidate in Candidates)
            {
                output.PutUInt32(candidate.ID);
                output.PutPascalVLCString(candidate.Name);
                output.PutUInt32(candidate.Rating);

                if (!NominationMode)
                {
                    output.PutPascalVLCString(candidate.LastNhoodName);
                    output.PutUInt32(candidate.LastNhoodID);
                    output.PutUInt32(candidate.TermNumber);
                    output.PutPascalVLCString(candidate.Message);
                }
            }
        }
    }

    public class NhoodCandidate
    {
        public uint ID;
        public string Name;
        public uint Rating;

        public string LastNhoodName = "";
        public uint LastNhoodID;
        public uint TermNumber;
        public string Message = "";
    }
}