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

namespace FSO.Files.Formats.IFF.Chunks
{
    public class CARR : IffChunk
    {
        public string Name;
        public JobLevel[] JobLevels;

        public override void Read(IffFile iff, Stream stream)
        {
            using (var io = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN))
            {
                io.ReadUInt32(); //pad
                var version = io.ReadUInt32();

                var MjbO = io.ReadUInt32();

                var compressionCode = io.ReadByte();
                if (compressionCode != 1) throw new Exception("hey what!!");

                Name = io.ReadNullTerminatedString();
                if (Name.Length % 2 == 1) io.ReadByte();
                var iop = new IffFieldEncode(io);


                var numLevels = iop.ReadInt32();

                JobLevels = new JobLevel[numLevels];
                for (int i=0; i<numLevels; i++)
                {
                    JobLevels[i] = new JobLevel(iop);
                }
            }
        }

        public int GetJobData(int level, int data)
        {
            var entry = JobLevels[level];
            switch (data)
            {
                case 0: //number of levels
                    return JobLevels.Length;
                case 1: //salary
                    return entry.Salary;
                case 12: //start hour
                    return entry.StartTime;
                case 13:
                    return entry.EndTime;
                case 21:
                    return entry.CarType;
                case 22:
                    return 0;
                default:
                    if (data < 12)
                        return entry.MinRequired[data-2];
                    else
                        return entry.MotiveDelta[data-14];
            }
        }
    }

    public class JobLevel
    {
        public int[] MinRequired = new int[10]; //friends, then skills.
        public int[] MotiveDelta = new int[7];
        public int Salary;
        public int StartTime;
        public int EndTime;
        public int CarType;

        public string JobName;
        public string MaleUniformMesh;
        public string FemaleUniformMesh;
        public string UniformSkin;
        public string unknown;

        public JobLevel(IffFieldEncode iop)
        {
            for (int i=0; i<MinRequired.Length; i++)
                MinRequired[i] = iop.ReadInt32();
            for (int i = 0; i < MotiveDelta.Length; i++)
                MotiveDelta[i] = iop.ReadInt32();
            Salary = iop.ReadInt32();
            StartTime = iop.ReadInt32();
            EndTime = iop.ReadInt32();
            CarType = iop.ReadInt32();

            JobName = iop.ReadString(false);
            MaleUniformMesh = iop.ReadString(false);
            FemaleUniformMesh = iop.ReadString(false);
            UniformSkin = iop.ReadString(false);
            unknown = iop.ReadString(true);
        }
    }
}