using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;

namespace HitmanPatcher
{
    public partial class OptionsForm : Form
    {
        private string customDomain;
        private bool startInTray, minimizeToTray;
        private List<string> trayDomains;

        private void toggleTheme(bool darkModeEnabled)
        {
            // Change main form background
            BackColor = darkModeEnabled ? Color.FromArgb(24, 26, 27) : SystemColors.Control;

            // Change the group box colours
            groupBox1.BackColor = darkModeEnabled ? Color.FromArgb(24, 26, 27) : SystemColors.Control;
            groupBox1.ForeColor = darkModeEnabled ? Color.White : SystemColors.ControlText;

            // Change button colours and style
            buttonSave.FlatStyle = darkModeEnabled ? FlatStyle.Flat : FlatStyle.Standard;
            buttonSave.BackColor = darkModeEnabled ? Color.FromArgb(19, 21, 22) : SystemColors.Control;
            buttonSave.ForeColor = darkModeEnabled ? Color.White : SystemColors.ControlText;

            buttonCancel.FlatStyle = darkModeEnabled ? FlatStyle.Flat : FlatStyle.Standard;
            buttonCancel.BackColor = darkModeEnabled ? Color.FromArgb(19, 21, 22) : SystemColors.Control;
            buttonCancel.ForeColor = darkModeEnabled ? Color.White : SystemColors.ControlText;

            buttonTrayOptions.FlatStyle = darkModeEnabled ? FlatStyle.Flat : FlatStyle.Standard;
            buttonTrayOptions.BackColor = darkModeEnabled ? Color.FromArgb(19, 21, 22) : SystemColors.Control;
            buttonTrayOptions.ForeColor = darkModeEnabled ? Color.White : SystemColors.ControlText;
        }

        public OptionsForm(Settings currentSettings)
        {
            InitializeComponent();
            Settings = currentSettings;
            startInTray = Settings.startInTray;
            minimizeToTray = Settings.minimizeToTray;
            trayDomains = Settings.trayDomains;
            toggleTheme(Settings.darkModeEnabled);
        }

        private void ButtonCancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }

        public Settings Settings
        {
            get =>
                new Settings()
                {
                    patchOptions = new MemoryPatcher.Options()
                    {
                        CustomConfigDomain = customDomain,
                        UseHttp = checkBoxHttp.Checked,
                        DisableForceOfflineOnFailedDynamicResources = dynResources.Checked,
                        DisableCertPinning = true,
                        SetCustomConfigDomain = true,
                        AlwaysSendAuthHeader = true
                    },
                    darkModeEnabled = darkModeBox.Checked,
                    startInTray = startInTray,
                    minimizeToTray = minimizeToTray,
                    trayDomains = trayDomains
                };
            private set
            {
                customDomain = value.patchOptions.CustomConfigDomain;
                checkBoxHttp.Checked = value.patchOptions.UseHttp;
                dynResources.Checked = value.patchOptions.DisableForceOfflineOnFailedDynamicResources;
                darkModeBox.Checked = value.darkModeEnabled;
                startInTray = value.startInTray;
                minimizeToTray = value.minimizeToTray;
                trayDomains = value.trayDomains;
            }
        }

        private void ButtonSave_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.OK;
            Close();
        }

        private void buttonTrayOptions_Click(object sender, EventArgs e)
        {
            TrayOptionsForm trayOptionsForm = new TrayOptionsForm(startInTray, minimizeToTray, trayDomains, Settings.darkModeEnabled);
            DialogResult result = trayOptionsForm.ShowDialog();
            if (result == DialogResult.OK)
            {
                startInTray = trayOptionsForm.startInTray;
                minimizeToTray = trayOptionsForm.minimizeToTray;
                trayDomains = trayOptionsForm.trayDomains;
            }
        }
    }
}