using System.IO;
using System.Security.Cryptography;

namespace MyNes.Core
{
    public class INes : IRom
    {
        public bool HasBattery { get; private set; }

        public bool IsPlaychoice10 { get; private set; }

        public bool IsVSUnisystem { get; private set; }

        public override void Load(string fileName, bool loadDumps)
        {
            var fileStream = MyNesMain.Supporter.OpenRomFile(fileName);
            if (fileStream.Length < 16)
            {
                fileStream.Close();
                base.IsValid = false;
                return;
            }
            byte[] array = new byte[16];
            fileStream.Read(array, 0, 16);
            byte[] buffer = new byte[fileStream.Length - 16];
            fileStream.Read(buffer, 0, (int)(fileStream.Length - 16));
            base.SHA1 = "";
            byte[] array2 = new SHA1Managed().ComputeHash(buffer);
            foreach (byte b in array2)
            {
                base.SHA1 += b.ToString("x2").ToLower();
            }
            if (array[0] != 78 || array[1] != 69 || array[2] != 83 || array[3] != 26)
            {
                fileStream.Close();
                base.IsValid = false;
                return;
            }
            base.PRGCount = array[4];
            base.CHRCount = array[5];
            switch (array[6] & 9)
            {
                case 0:
                    base.Mirroring = Mirroring.Horz;
                    break;
                case 1:
                    base.Mirroring = Mirroring.Vert;
                    break;
                case 8:
                case 9:
                    base.Mirroring = Mirroring.Full;
                    break;
            }
            HasBattery = (array[6] & 2) != 0;
            base.HasTrainer = (array[6] & 4) != 0;
            if ((array[7] & 0xF) == 0)
            {
                base.MapperNumber = (byte)((array[7] & 0xF0) | (array[6] >> 4));
            }
            else
            {
                base.MapperNumber = (byte)(array[6] >> 4);
            }
            IsVSUnisystem = (array[7] & 1) != 0;
            IsPlaychoice10 = (array[7] & 2) != 0;
            if (loadDumps)
            {
                fileStream.Seek(16L, SeekOrigin.Begin);
                if (base.HasTrainer)
                {
                    base.Trainer = new byte[512];
                    fileStream.Read(base.Trainer, 0, 512);
                }
                else
                {
                    base.Trainer = new byte[0];
                }
                base.PRG = new byte[base.PRGCount * 16384];
                fileStream.Read(base.PRG, 0, base.PRGCount * 16384);
                if (base.CHRCount > 0)
                {
                    base.CHR = new byte[base.CHRCount * 8192];
                    fileStream.Read(base.CHR, 0, base.CHRCount * 8192);
                }
                else
                {
                    base.CHR = new byte[0];
                }
            }
            base.IsValid = true;
            fileStream.Dispose();
            fileStream.Close();
        }
    }
}