using System;
using System.Collections.Generic;

namespace gaseous_romsignatureobject
{
    /// <summary>
    /// Object returned by all signature engines containing metadata about the ROM's in the data files
    ///
    /// This class was based on the TOSEC dataset, so may need to be expanded as new signature engines are added
    /// </summary>
	public class RomSignatureObject
    {
        public string? Name { get; set; }
        public string? Description { get; set; }
        public string? Category { get; set; }
        public string? Version { get; set; }
        public string? Author { get; set; }
        public string? Email { get; set; }
        public string? Homepage { get; set; }
        public Uri? Url { get; set; }
        public string? SourceType { get; set; }
        public string SourceMd5 { get; set; } = "";
        public string SourceSHA1 { get; set; } = "";

        public List<Game> Games { get; set; } = new List<Game>();

        public class Game
        {
            public string? Name { get; set; }
            public string? Description { get; set; }
            public string? Year { get; set; }
            public string? Publisher { get; set; }
            public DemoTypes Demo { get; set; }
            public string? System { get; set; }
            public string? SystemVariant { get; set; }
            public string? Video { get; set; }
            public string? Country { get; set; }
            public string? Language { get; set; }
            public string? Copyright { get; set; }
            public List<Rom> Roms { get; set; } = new List<Rom>();
            public int RomCount
            {
                get
                {
                    return Roms.Count();
                }
            }

            public enum DemoTypes
            {
                NotDemo = 0,
                demo = 1,
                demo_kiosk = 2,
                demo_playable = 3,
                demo_rolling = 4,
                demo_slideshow = 5
            }

            public class Rom
            {
                public string? Name { get; set; }
                public UInt64? Size { get; set; }
                public string? Crc { get; set; }
                public string? Md5 { get; set; }
                public string? Sha1 { get; set; }

                public string? DevelopmentStatus { get; set; }

                public List<string> flags { get; set; } = new List<string>();

                public RomTypes RomType { get; set; }
                public string? RomTypeMedia { get; set; }
                public string? MediaLabel { get; set; }

                public SignatureSourceType SignatureSource { get; set; }

                public enum SignatureSourceType
                {
                    None = 0,
                    TOSEC = 1
                }

                public enum RomTypes
                {
                    /// <summary>
                    /// Media type is unknown
                    /// </summary>
                    Unknown = 0,

                    /// <summary>
                    /// Optical media
                    /// </summary>
                    Disc = 1,

                    /// <summary>
                    /// Magnetic media
                    /// </summary>
                    Disk = 2,

                    /// <summary>
                    /// Individual files
                    /// </summary>
                    File = 3,

                    /// <summary>
                    /// Individual pars
                    /// </summary>
                    Part = 4,

                    /// <summary>
                    /// Tape base media
                    /// </summary>
                    Tape = 5,

                    /// <summary>
                    /// Side of the media
                    /// </summary>
                    Side = 6
                }
            }

        }
    }
}

