using System.Windows.Forms;

namespace MicronSync
{
    public class MessageHandler
    {  
        // Call error messages by specifying an enum code
        public enum msgCodes
        {
            _TestSample,
            MainWindow_Warn_Purge,
            MainWindow_Warn_Purge_Null,
            MainWindow_Warn_OverwriteFile,
            NewRegKeyUI_CorrectKey,
            MainWindow_SaveChanges,
            MainWindow_LoadIncompatible,
        }

        public enum errCodes
        {
            _TestSample,
            WorkerUI_BadBackupPath,
            WorkerUI_BadRestorePath,
            MainWindow_RestrictedPath,
            MainWindow_PathRootInvalid,
            MainWindow_DstWithinSrc,
            MainWindow_RestoreError,
            MainWindow_BackupError,
            Config_ReadError,
            MainWindow_ArchiveNotFound,
            NewRegKeyUI_InvalidKey,
            NewRegKeyUI_PirateKey,
            MainWindow_BadConfigFile,
            MainWindow_BadConfigFile_FromEXE,
            MainWindow_DirectoryNotFound,
            Config_BadFile,
            MainWindow_BadExplorePath,
            MainWindow_EmptyExplorePath,
            MainWindow_SZNotInstalled,
        }

        /// <summary>
        /// Create an error message dialogue box.
        /// </summary>
        /// <param name="mc"></param>
        /// <param name="info"></param>
        internal static void errorMessage(errCodes mc, string info)
        {
            switch (mc)
            {
                case errCodes._TestSample:
                    MessageBox.Show("This is a sample error message", "Sample Error Message",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case errCodes.WorkerUI_BadBackupPath:
                    MessageBox.Show("The specified source path is inaccessible. Please ensure the path exists and you have read/write permission, then try again.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case errCodes.WorkerUI_BadRestorePath:
                    MessageBox.Show("The specified restore path is inaccessible. Please ensure the file exists and try again.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case errCodes.MainWindow_RestrictedPath:
                    MessageBox.Show($"The following path cannot be used:\n{info}", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_PathRootInvalid:
                    MessageBox.Show($"Drive roots cannot be used. Please select a valid sub-directory.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_DstWithinSrc:
                    MessageBox.Show($"You cannot create a backup inside of the folder you're tying to backup. Please enter a valid path and try again.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_RestoreError:
                    MessageBox.Show($"There was a problem restoring from the selected backup. Please ensure you have sufficient read/write access.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case errCodes.MainWindow_BackupError:
                    MessageBox.Show($"There was a problem backing up the selected directory, check you have entered the correct path. Additionally, ensure you have sufficient read/write access.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case errCodes.Config_ReadError:
                    MessageBox.Show($"The current directory is either write-protected or the configuration file is corrupt.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_ArchiveNotFound:
                    MessageBox.Show($"The backup file specified does not exist.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_DirectoryNotFound:
                    MessageBox.Show($"The backup directory specified does not exist.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.NewRegKeyUI_InvalidKey:
                    MessageBox.Show($"The key you have entered is invalid. Please ensure you have typed it in the correct format.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case errCodes.NewRegKeyUI_PirateKey:
                    MessageBox.Show($"You have imported a bad key onto your system. It will now be deleted for the continued use of this software.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                case errCodes.MainWindow_BadConfigFile:
                    MessageBox.Show($"Unsupported data.\nPlease only drop configs, directories or 7-Zip files!", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_BadConfigFile_FromEXE:
                    MessageBox.Show($"Unsupported data.\nOnly config files are supported when loaded directly from application!", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.Config_BadFile:
                    MessageBox.Show($"The following configuration file is corrupt or invalid:\n\n{info}", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_BadExplorePath:
                    MessageBox.Show($"The following path could not be found:\n\n{info}", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_EmptyExplorePath:
                    MessageBox.Show($"Cannot browse to an empty path.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    break;
                case errCodes.MainWindow_SZNotInstalled:
                    MessageBox.Show("7z.exe/7z.dll can not be found in the working directory. Please ensure they both exist and try again.", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
            }

        }

        /// <summary>
        /// Create an informational message dialogue box.
        /// </summary>
        /// <param name="mc"></param>
        /// <param name="info"></param>
        /// <returns></returns>
        internal static DialogResult stdMessage(msgCodes mc, string info)
        {
            DialogResult _dialogResult = DialogResult.None;

            switch (mc)
            {
                case msgCodes.MainWindow_Warn_Purge:
                    _dialogResult = MessageBox.Show($"Purging will permanently delete ALL data within the following directory prior to attempting to restore:\n\"{info}\"\n\nBacking up is strongly recommended, continue enabling option?", "MicronSync - Dangerous operation",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        break;
                case msgCodes.MainWindow_Warn_Purge_Null:
                    _dialogResult = MessageBox.Show($"Purging will permanently delete ALL data within the restore destintation directory prior to attempting to restore.\n\nBacking up is strongly recommended, continue enabling option?", "MicronSync - Dangerous operation",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    break;
                case msgCodes.MainWindow_Warn_OverwriteFile:
                    _dialogResult = MessageBox.Show($"There is already a file with the same name in the specified directory:\n{info}\n\nWould you like to overwrite it?", "MicronSync - Confirm overwrite",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    break;
                case msgCodes.NewRegKeyUI_CorrectKey:
                    _dialogResult = MessageBox.Show($"Thank you for registering MicronSync :-)", "MicronSync",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
                case msgCodes.MainWindow_SaveChanges:
                    _dialogResult = MessageBox.Show($"There are currently unsaved changes, would you like to save before exiting?\n\n{info}", "MicronSync",
                        MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                    break;
                case msgCodes.MainWindow_LoadIncompatible:
                    _dialogResult = MessageBox.Show($"You are trying load a legacy config file (v{info}) which is incompatible with this version of MicronSync.\nPlease load a config file which is at least of version 1.2.0.0 or create a new one, sorry for any inconvenience caused!", "MicronSync - Incompatible config",
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    break;
            }
            return _dialogResult;
        }
    }
}
