using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame;
using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer;

namespace DotNetCTFDumper.MMFParser.Translation
{
    public static class Pame2Mfa
    {
        public static event Program.DumperEvent TranslatingFrame;
        
        public static void Translate(ref MFA.MFA mfa, GameData game)
        {
            
            //mfa.MfaBuild = 4;
            //mfa.Product = (int) game.ProductVersion;
            //mfa.BuildVersion = 283;
            mfa.Name = game.Name;
            mfa.LangId = 0;
            mfa.Description = $"Decompiled with {Settings.DumperVersion}";
            mfa.Path = game.EditorFilename;
            
            //mfa.Stamp = wtf;
            /*if (game.Fonts != null) mfa.Fonts = game.Fonts;
            
            mfa.Sounds = game.Sounds;
            foreach (var item in mfa.Sounds.Items)
            {
                item.IsCompressed = false;
            }
            mfa.Music = game.Music;
            mfa.Images.Items = game.Images.Images;
            foreach (var key in mfa.Images.Items.Keys)
            {
                mfa.Images.Items[key].Debug = true;
            }
            */
            mfa.Author = game.Author ?? "Kostya";
            mfa.Copyright = game.Copyright ??"CTFAN Team";
            mfa.Company = "CTFAN Team";
            mfa.Version = "";
            //TODO:Binary Files
            var displaySettings = mfa.DisplayFlags;
            var graphicSettings = mfa.GraphicFlags;
            var flags = game.Header.Flags;
            var newFlags = game.Header.NewFlags;
            //TODO:Flags, no setter
            mfa.WindowX = game.Header.WindowWidth;
            mfa.WindowY = game.Header.WindowHeight;
            mfa.BorderColor = game.Header.BorderColor;
            mfa.HelpFile = "";
            mfa.VitalizePreview = new byte[]{0x0};
            mfa.InitialScore = game.Header.InitialScore;
            mfa.InitialLifes = game.Header.InitialLives;
            mfa.FrameRate = game.Header.FrameRate;
            mfa.BuildType = 0;
            mfa.BuildPath = game.TargetFilename;
            mfa.CommandLine = "";
            mfa.Aboutbox = game.AboutText?.Length > 0
                ? game?.AboutText
                : "This game was decompiled with " + Settings.DumperVersion;
            mfa.Frames.Clear();
            foreach (Frame gameFrame in game.Frames)
            {
                var mfaFrame = ConvertFrame(gameFrame);
                mfaFrame.Handle = game.Frames.IndexOf(gameFrame);
                mfa.Frames.Add(mfaFrame);
               
            }
        }

        public static MFA.Loaders.Transition ConvertTransition(EXE.Loaders.Transition gameTrans)
        {
            var mfaTrans = new MFA.Loaders.Transition((ByteReader) null);
            mfaTrans.Module = gameTrans.ModuleFile;
            mfaTrans.Name = gameTrans.Name.FirstCharToUpper();
            mfaTrans.Id = gameTrans.Module;
            mfaTrans.TransitionId = gameTrans.Name;
            mfaTrans.Flags = gameTrans.Flags;
            mfaTrans.Color = gameTrans.Color;
            mfaTrans.ParameterData = gameTrans.ParameterData;
            mfaTrans.Duration = gameTrans.Duration;
            return mfaTrans;

        }

        public static MFA.Loaders.Frame ConvertFrame(EXE.Loaders.Frame gameFrame)
        {
            MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null);
            TranslatingFrame?.Invoke(gameFrame.Name);
            mfaFrame.Name = gameFrame.Name;
            mfaFrame.SizeX = gameFrame.Width;
            mfaFrame.SizeY = gameFrame.Height;
            mfaFrame.Background = gameFrame.Background;
            if (gameFrame.FadeIn != null)mfaFrame.FadeIn = ConvertTransition(gameFrame.FadeIn);
            if (gameFrame.FadeOut != null)mfaFrame.FadeOut = ConvertTransition(gameFrame.FadeOut);
            
            //TODO:Flags
            mfaFrame.MaxObjects = gameFrame.Events?.MaxObjects ?? 10000;
            mfaFrame.Password = gameFrame?.Password ?? "";
            mfaFrame.LastViewedX = 320;
            mfaFrame.LastViewedY = 240;
            mfaFrame.Palette = gameFrame.Palette.Items;
            mfaFrame.StampHandle = 12;
            mfaFrame.ActiveLayer = 0;
            mfaFrame.Layers = new List<Layer>();

            foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items)
            {
                Layer mfaLayer = new Layer(null)
                {
                    Name = gameLayer.Name,
                    Flags =
                    {
                        ["HideAtStart"] = gameLayer.Flags["ToHide"],
                        ["Visible"] = true,
                        ["NoBackground"] = gameLayer.Flags["DoNotSaveBackground"],
                        ["WrapHorizontally"] = gameLayer.Flags["WrapHorizontally"],
                        ["WrapVertically"] = gameLayer.Flags["WrapVertically"]
                
                    },
                    XCoefficient = gameLayer.XCoeff,
                    YCoefficient = gameLayer.YCoeff
                };
                mfaFrame.Layers.Add(mfaLayer);
                break;
                //TODO: Fix layers
            }
            mfaFrame.Events = MFA.MFA.emptyEvents;
            mfaFrame.Chunks = MFA.MFA.emptyFrameChunks;
            return mfaFrame;
        }
    }

    
}