using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using Электронная_Фармация.Classes;

namespace Электронная_Фармация.HelpForms
{
    public partial class HF_UpdateAvailable : Form
    {
        private readonly UpdateCheckResult _result;
        private bool _updating;

        public HF_UpdateAvailable(UpdateCheckResult result)
        {
            _result = result ?? throw new ArgumentNullException(nameof(result));
            InitializeComponent();
            UiThemeHelper.ApplyToControlTree(this);

            var latest = string.IsNullOrWhiteSpace(_result.LatestVersion) ? "?" : _result.LatestVersion;
            var local = string.IsNullOrWhiteSpace(_result.LocalVersion) ? "?" : _result.LocalVersion;
            lblMessage.Text =
                $"Доступно новое обновление {latest} (у вас {local}).{Environment.NewLine}{Environment.NewLine}" +
                "Нажмите «Обновить» — программа скачает и установит новую версию сама." + Environment.NewLine +
                "Локальная база и данные сохранятся.";
            btnDownload.Text = "Обновить";
        }

        private async void btnDownload_Click(object sender, EventArgs e)
        {
            if (_updating)
            {
                return;
            }

            if (string.IsNullOrWhiteSpace(_result.DownloadUrl) &&
                string.IsNullOrWhiteSpace(_result.ReleaseUrl))
            {
                UiDialogs.ShowError("Ссылка на обновление не задана.", "Обновление", this);
                return;
            }

            _updating = true;
            btnDownload.Enabled = false;
            btnExit.Enabled = false;
            ControlBox = false;

            var progress = new Progress<string>(msg =>
            {
                lblMessage.Text = msg;
            });

            try
            {
                await AutoUpdater.ApplyUpdateAsync(_result, progress);
                lblMessage.Text = "Обновление скачано. Перезапуск...";
                // Снимаем блокировку закрытия, иначе диалог зависает навечно
                // на «Перезапуск...» и updater ждёт PID, который не завершается.
                _updating = false;
                DialogResult = DialogResult.OK;
                Close();
            }
            catch (Exception ex)
            {
                AppDebugLog.Error("Update", "Автообновление не удалось", ex);
                _updating = false;
                btnDownload.Enabled = true;
                btnExit.Enabled = true;
                ControlBox = true;
                UiDialogs.ShowError(
                    "Не удалось установить обновление автоматически." + Environment.NewLine +
                    ex.Message,
                    "Обновление",
                    this);
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            if (_updating)
            {
                return;
            }

            DialogResult = DialogResult.Abort;
            Close();
        }

        private void HF_UpdateAvailable_FormClosing(object sender, FormClosingEventArgs e)
        {
            // Блокируем только ручное закрытие во время скачивания.
            if (_updating && DialogResult != DialogResult.OK)
            {
                e.Cancel = true;
                return;
            }

            // Крестик / Alt+F4 — выход из приложения (не пускать в работу).
            if (DialogResult != DialogResult.Abort && DialogResult != DialogResult.OK)
            {
                DialogResult = DialogResult.Abort;
            }
        }
    }
}
