using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Bfres.Structs;
using Switch_Toolbox.Library.Forms;
using Syroot.NintenTools.NSW.Bfres;


namespace FirstPlugin.Forms
{
    public partial class RenderInfoEditor : UserControl
    {
        public RenderInfoEditor()
        {
            InitializeComponent();

            renderInfoListView.ListViewItemSorter = new ListSorter();
        }

        FMAT material;
        BfresRenderInfo activeRenderInfo;

        public void InitializeRenderInfoList(FMAT mat)
        {
            material = mat;

            renderInfoListView.BeginUpdate();
            renderInfoListView.Items.Clear();

            foreach (var rnd in material.renderinfo)
                renderInfoListView.Items.Add(CreateRenderInfoItem(rnd));

            renderInfoListView.FullRowSelect = true;
            renderInfoListView.EndUpdate();
        }
        private ListViewItem CreateRenderInfoItem(BfresRenderInfo rnd)
        {
            ListViewItem item = new ListViewItem();
            item.Text = rnd.Name;

            string Value = "";
            switch (rnd.Type)
            {
                case RenderInfoType.Int32:
                    Value = string.Join(",", rnd.ValueInt);
                    break;
                case RenderInfoType.Single:
                    Value = string.Join(",", rnd.ValueFloat);
                    break;
                case RenderInfoType.String:
                    Value = string.Join(",", rnd.ValueString);
                    break;
            }
            item.SubItems.Add(Value);
            item.SubItems.Add(rnd.Type.ToString());
            return item;
        }


        private void btnAddRenderInfo_Click(object sender, EventArgs e)
        {
            BfresRenderInfo info = new BfresRenderInfo();
            activeRenderInfo = info;
            activeRenderInfo.Type = RenderInfoType.Int32;
            activeRenderInfo.ValueInt = new int[0];
            bool IsEdited = EditData();

            if (IsEdited)
            {
                material.renderinfo.Add(activeRenderInfo);
                InitializeRenderInfoList(material);
            }
        }
        private bool EditData()
        {
            if (activeRenderInfo == null)
                return false;

            RenderInfoDataEditor editor = new RenderInfoDataEditor();
            editor.RenderInfoName = activeRenderInfo.Name;
            editor.FormatType = activeRenderInfo.Type.ToString();
            editor.LoadPresets();

            switch (activeRenderInfo.Type)
            {
                case RenderInfoType.String:
                    editor.LoadValues(activeRenderInfo.ValueString);
                    break;
                case RenderInfoType.Single:
                    editor.LoadValues(activeRenderInfo.ValueFloat);
                    break;
                case RenderInfoType.Int32:
                    editor.LoadValues(activeRenderInfo.ValueInt);
                    break;
            }
            if (editor.ShowDialog() == DialogResult.OK)
            {
                activeRenderInfo.Name = editor.RenderInfoName;

                if (editor.FormatType == "Single")
                {
                    activeRenderInfo.Type = RenderInfoType.Single;
                    activeRenderInfo.ValueFloat = editor.GetFloats();
                }
                if (editor.FormatType == "Int32")
                {
                    activeRenderInfo.Type = RenderInfoType.Int32;
                    activeRenderInfo.ValueInt = editor.GetInts();
                }
                if (editor.FormatType == "String")
                {
                    activeRenderInfo.Type = RenderInfoType.String;
                    activeRenderInfo.ValueString = editor.GetStrings();
                }
                InitializeRenderInfoList(material);

                return true;
            }
            return false;
        }

        private void btnRemoveRenderInfo_Click(object sender, EventArgs e)
        {
            if (renderInfoListView.SelectedItems.Count > 0)
            {
               var result = MessageBox.Show($"Are you sure you want to remove {renderInfoListView.SelectedItems[0].Text}? This could potentially break things!",
               "Render Info Editor", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

                if (result == DialogResult.OK)
                {
                    material.renderinfo.RemoveAt(renderInfoListView.SelectedIndices[0]);
                    renderInfoListView.Items.RemoveAt(renderInfoListView.SelectedIndices[0]);
                }
            }
        }

        private void renderInfoListView_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (renderInfoListView.SelectedItems.Count > 0)
            {
                btnRemove.Enabled = true;
            }
            else
                btnRemove.Enabled = false;
        }

        private void renderInfoListView_DoubleClick(object sender, EventArgs e)
        {
            EditData();
        }

        private void renderInfoListView_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            if (renderInfoListView.SelectedItems.Count > 0)
            {
                btnScrolDown.Enabled = true;
                btnScrollUp.Enabled = true;
                btnEdit.Enabled = true;
                btnRemove.Enabled = true;

                foreach (var info in material.renderinfo)
                {
                    if (info.Name == renderInfoListView.SelectedItems[0].Text)
                        activeRenderInfo = info;
                }
            }
            else
            {
                activeRenderInfo = null;
                btnScrolDown.Enabled = false;
                btnScrollUp.Enabled = false;
                btnEdit.Enabled = false;
                btnRemove.Enabled = false;
            }
        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            EditData();
        }
    }
}