using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ShiftOS
{
    public partial class TextPad : Form
    {
        private bool codepointscooldown = false;
        private int codepointsearned = 0;
        private bool needtosave = false;
                
        public TextPad()
        {
            InitializeComponent();
        }

        private void TextPad_Load(object sender, EventArgs e)
        {
            txtuserinput.Size = new Size(txtuserinput.Size.Width, txtuserinput.Size.Height + pnloptions.Height);
            setupoptions();
        }

        // ERROR: Handles clauses are not supported in C#
        private void pnlbreak_MouseEnter(object sender, EventArgs e)
        {
            if (pnloptions.Visible == false)
            {
                pnlbreak.BackgroundImage = Properties.Resources.downarrow;
                pnloptions.Show();
                txtuserinput.Size = new Size(txtuserinput.Size.Width, txtuserinput.Size.Height - pnloptions.Height);
            }
            else {
                pnlbreak.BackgroundImage = Properties.Resources.uparrow;
                pnloptions.Hide();
                txtuserinput.Size = new Size(txtuserinput.Size.Width, txtuserinput.Size.Height + pnloptions.Height);
            }
        }

        // ERROR: Handles clauses are not supported in C#
        private void btnnew_Click(object sender, EventArgs e)
        {
            if (needtosave == true)
            {
                API.CreateInfoboxSession("Textpad - Save?", "It appears that your text document currently contains unsaved changes." + Environment.NewLine + Environment.NewLine + "Are you sure you want to start a new document without saving the changes?", infobox.InfoboxMode.YesNo);
                API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) =>
                {
                    string result = API.GetInfoboxResult();
                    switch(result)
                    {
                        case "Yes":
                            codepointsearned = 0;
                            this.txtuserinput.Text = "";
                            break;
                        case "No":
                            SaveFile();
                            break;
                    }
                };
            }
            else {
                makenewdoc();
            }
        }

        private void SaveFile()
        {
            if (API.Upgrades["trmfiles"] == true)
            {
                API.CreateFileSkimmerSession(".txt;.trm", File_Skimmer.FileSkimmerMode.Save);

            }
            else
            {
                API.CreateFileSkimmerSession(".txt", File_Skimmer.FileSkimmerMode.Save);
            }
            API.FileSkimmerSession.FormClosing += (object se, FormClosingEventArgs ea) =>
            {
                string res = API.GetFSResult();
                if (res != "fail")
                {
                    File.WriteAllText(res, txtuserinput.Text);
                }
            };
        }

        private void SaveFile(string text)
        {
            if (API.Upgrades["trmfiles"] == true)
            {
                API.CreateFileSkimmerSession(".txt;.trm", File_Skimmer.FileSkimmerMode.Save);

            }
            else
            {
                API.CreateFileSkimmerSession(".txt", File_Skimmer.FileSkimmerMode.Save);
            }
            API.FileSkimmerSession.FormClosing += (object se, FormClosingEventArgs ea) =>
            {
                string res = API.GetFSResult();
                if (res != "fail")
                {
                    File.WriteAllText(res, text);
                }
            };
        }

        public void makenewdoc()
        {
            txtuserinput.Text = "";
            needtosave = false;
            codepointsearned = 0;
        }

        // ERROR: Handles clauses are not supported in C#
        private void btnsave_Click(object sender, EventArgs e)
        {
            SaveFile();
        }

        // ERROR: Handles clauses are not supported in C#
        private void btnopen_Click(object sender, EventArgs e)
        {
            API.CreateFileSkimmerSession(".txt", File_Skimmer.FileSkimmerMode.Open);
            API.FileSkimmerSession.FormClosing += (object s, FormClosingEventArgs a) =>
            {
                if (needtosave == true)
                {
                    API.CreateInfoboxSession("Textpad - Save?", "It appears that your text document currently contains unsaved changes." + Environment.NewLine + Environment.NewLine + "Are you sure you want to start a new document without saving the changes?", infobox.InfoboxMode.YesNo);
                    API.InfoboxSession.FormClosing += (object se, FormClosingEventArgs ea) =>
                    {
                        string result = API.GetInfoboxResult();
                        switch (result)
                        {
                            case "Yes":
                                codepointsearned = 0;
                                string res = API.GetFSResult();
                                if (res != "fail")
                                {
                                    string fContents = File.ReadAllText(res);

                                    txtuserinput.Text = fContents;
                                }
                                break;
                            case "No":
                                string fcontents = txtuserinput.Text;
                                SaveFile(fcontents);
                                string res2 = API.GetFSResult();
                                if (res2 != "fail")
                                {
                                    string fContents = File.ReadAllText(res2);
                                    
                                    txtuserinput.Text = fContents;
                                }
                                break;
                        }
                    };
                }
                else {
                    string res = API.GetFSResult();
                    if (res != "fail")
                    {
                        try {
                            string fContents = File.ReadAllText(res);

                            txtuserinput.Text = fContents;
                        }
                        catch(Exception ex)
                        {
                            txtuserinput.Text = ex.Message;
                        }
                    }
                }
            };
        }

        public void setupoptions()
        {
            if (API.Upgrades["textpadnew"] == true)
                btnnew.Show();
            else
                btnnew.Hide();
            if (API.Upgrades["textpadopen"] == true)
                btnopen.Show();
            else
                btnopen.Hide();
            if (API.Upgrades["textpadsave"] == true)
                btnsave.Show();
            else
                btnsave.Hide();
            if (API.Upgrades["textpadnew"] == false && API.Upgrades["textpadsave"] == false && API.Upgrades["textpadopen"] == false)
                pnlbreak.Hide();
        }

        // ERROR: Handles clauses are not supported in C#
        private void txtuserinput_TextChanged(object sender, EventArgs e)
        {
            needtosave = true;
            if (codepointscooldown == true)
            {
            }
            else {
                codepointsearned = codepointsearned + 1;
                codepointscooldown = true;
                tmrcodepointcooldown.Start();
            }
            if (Viruses.InfectedWith("keyboardfucker"))
            {
                var rnd = new Random();
                if (rnd.Next(0, 20) == 10)
                {
                    txtuserinput.Text += Viruses.KeyboardInceptor.Intercept();
                }
            }
        }

        // ERROR: Handles clauses are not supported in C#
        private void tmrcodepointcooldown_Tick(object sender, EventArgs e)
        {
            codepointscooldown = false;
            tmrcodepointcooldown.Stop();
        }

        // ERROR: Handles clauses are not supported in C#
        private void tmrshowearnedcodepoints_Tick(object sender, EventArgs e)
        {
            API.CreateInfoboxSession("TextPad", "You have earned " + codepointsearned.ToString() + " Codepoints from typing up and saving that document!", infobox.InfoboxMode.Info);
            API.AddCodepoints(codepointsearned);
            tmrshowearnedcodepoints.Stop();
        }
    }
}