using System;
using System.IO;
using System.Text;

using ColdMint.scripts.camp;
using ColdMint.scripts.contribute;
using ColdMint.scripts.deathInfo;
using ColdMint.scripts.debug;
using ColdMint.scripts.inventory;
using ColdMint.scripts.item;
using ColdMint.scripts.loot;
using ColdMint.scripts.map;
using ColdMint.scripts.map.roomInjectionProcessor;
using ColdMint.scripts.utils;

using Godot;

namespace ColdMint.scripts.loader.uiLoader;

/// <summary>
/// <para>UI loader for the main menu</para>
/// <para>主菜单的UI加载器</para>
/// </summary>
public partial class MainMenuLoader : UiLoaderTemplate
{
    private Button? _startGameButton;
    private Label? _copyrightLabel;
    private StringBuilder? _copyrightBuilder;
    private PackedScene? _gameScene;
    private PackedScene? _contributor;
    private PackedScene? _levelGraphEditor;
    private Label? _sloganLabel;
    private Label? _versionLabel;
    private Button? _levelGraphEditorButton;
    private LinkButton? _contributorButton;

    public override void InitializeData()
    {
        if (Config.IsDebug())
        {
            //Set the minimum log level to Info in debug mode.(Print all logs)
            //在调试模式下将最小日志等级设置为Info。(打印全部日志)
            LogCat.MinLogLevel = LogCat.InfoLogLevel;
        }
        else
        {
            //Disable all logs in the release version.
            //在发行版禁用所有日志。
            LogCat.MinLogLevel = LogCat.DisableAllLogLevel;
        }


        ContributorDataManager.RegisterAllContributorData();
        DeathInfoGenerator.RegisterDeathInfoHandler(new SelfDeathInfoHandler());
        MapGenerator.RegisterRoomInjectionProcessor(new ChanceRoomInjectionProcessor());
        MapGenerator.RegisterRoomInjectionProcessor(new TimeIntervalRoomInjectorProcessor());
        //Register the corresponding encoding provider to solve the problem of garbled Chinese path of the compressed package
        //注册对应的编码提供程序,解决压缩包中文路径乱码问题
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        //创建游戏数据文件夹
        var dataPath = Config.GetGameDataDirectory();
        if (!Directory.Exists(dataPath))
        {
            Directory.CreateDirectory(dataPath);
        }


        //Registered camp
        //注册阵营
        var defaultCamp = new Camp(Config.CampId.Default)
        {
            FriendInjury = true
        };
        CampManager.SetDefaultCamp(defaultCamp);
        var mazoku = new Camp(Config.CampId.Mazoku);
        CampManager.AddCamp(mazoku);
        var aborigines = new Camp(Config.CampId.Aborigines);
        CampManager.AddCamp(aborigines);
        _gameScene = GD.Load<PackedScene>("res://scenes/game.tscn");
        _contributor = GD.Load<PackedScene>("res://scenes/contributor.tscn");
        _levelGraphEditor = GD.Load<PackedScene>("res://scenes/levelGraphEditor.tscn");
        
        //Register ItemTypes from file
        //从文件注册物品类型
        ItemTypeRegister.RegisterFromFile();
        //Hardcoded ItemTypes Register
        //硬编码注册物品类型
        ItemTypeRegister.StaticRegister();
        
        //静态注册掉落表
        LootRegister.StaticRegister();
    }

    public override void InitializeUi()
    {
        _contributorButton = GetNode<LinkButton>("VBoxContainer2/ContributorButton");
        _startGameButton = GetNode<Button>("StartGameButton");
        _levelGraphEditorButton = GetNode<Button>("levelGraphEditorButton");
        //The level map editor is only available in debug mode.
        //关卡图编辑器仅在调试模式可用。
        _levelGraphEditorButton.Visible = Config.IsDebug();
        _startGameButton.GrabFocus();
        _versionLabel = GetNode<Label>("VBoxContainer2/VersionLabel");
        //Generative copyright
        //生成版权
        _copyrightLabel = GetNode<Label>("VBoxContainer/CopyrightLabel");
        _sloganLabel = GetNode<Label>("CenterContainer2/SloganLabel");
        _copyrightBuilder = new StringBuilder();
        _copyrightBuilder.Append('\u00a9');
        var currentYear = DateTime.Now.Year;
        _copyrightBuilder.Append(Config.CreationYear);
        if (currentYear != Config.CreationYear)
        {
            _copyrightBuilder.Append('-');
            _copyrightBuilder.Append(currentYear);
        }

        _copyrightBuilder.Append(' ');
        _copyrightBuilder.Append(Config.CompanyName);
        _copyrightBuilder.Append(" all rights reserved.");
        _copyrightLabel.Text = _copyrightBuilder.ToString();
        _versionLabel.Text = "ver." + Config.GetVersion();
        _sloganLabel.Text = SloganProvider.GetSlogan();
        _contributorButton.Text =
            TranslationServerUtils.TranslateWithFormat("ui_contributor_tips",
                ContributorDataManager.GetContributorTotals());
    }

    public override void LoadUiActions()
    {
        if (_startGameButton != null)
        {
            _startGameButton.Pressed += () =>
            {
                LogCat.Log("start_game");
                if (_gameScene == null)
                {
                    return;
                }
                GetTree().ChangeSceneToPacked(_gameScene);
            };
        }

        if (_contributorButton!=null)
        {
            _contributorButton.Pressed += () =>
            {
                if (_contributor == null)
                {
                    return;
                }
                GetTree().ChangeSceneToPacked(_contributor);
            };
        }

        if (_levelGraphEditorButton != null)
        {
            _levelGraphEditorButton.Pressed += () =>
            {
                LogCat.Log("level_graph_editor");
                if (_levelGraphEditor == null)
                {
                    return;
                }
                GetTree().ChangeSceneToPacked(_levelGraphEditor);
            };
        }
    }
}