using FSO.Files.Utils;
using System;
using System.IO;

namespace FSO.Files.Formats.tsodata
{
    public class BulletinItem
    {
        public static int CURRENT_VERSION = 1;
        public int Version = CURRENT_VERSION;
        public uint ID;
        public uint NhoodID;
        public uint SenderID;

        public string Subject;
        public string Body;
        public string SenderName;

        public long Time;

        public BulletinType Type;
        public BulletinFlags Flags;

        public uint LotID; //optional: for lot advertisements.

        public BulletinItem()
        {

        }

        public BulletinItem(Stream stream)
        {
            Read(stream);
        }

        public void Save(Stream stream)
        {
            using (var writer = IoWriter.FromStream(stream))
            {
                writer.WriteCString("FSOB", 4);
                writer.WriteInt32(Version);
                writer.WriteUInt32(ID);
                writer.WriteUInt32(NhoodID);
                writer.WriteUInt32(SenderID);

                writer.WriteLongPascalString(Subject);
                writer.WriteLongPascalString(Body);
                writer.WriteLongPascalString(SenderName);
                writer.WriteInt64(Time);
                writer.WriteInt32((int)Type);
                writer.WriteInt32((int)Flags);

                writer.WriteUInt32(LotID);
            }
        }

        public void Read(Stream stream)
        {
            using (var reader = IoBuffer.FromStream(stream))
            {
                var magic = reader.ReadCString(4);
                Version = reader.ReadInt32();
                ID = reader.ReadUInt32();
                NhoodID = reader.ReadUInt32();
                SenderID = reader.ReadUInt32();

                Subject = reader.ReadLongPascalString();
                Body = reader.ReadLongPascalString();
                SenderName = reader.ReadLongPascalString();
                Time = reader.ReadInt64();
                Type = (BulletinType)reader.ReadInt32();
                Flags = (BulletinFlags)reader.ReadInt32();

                LotID = reader.ReadUInt32();
            }
        }
    }

    public enum BulletinType
    {
        Mayor = 0,
        System = 1,
        Community = 2,
    }

    [Flags]
    public enum BulletinFlags
    {
        PromotedByMayor = 1
    }
}