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

namespace Электронная_Фармация.Forms
{
    public partial class FConsignees : Form
    {
        public string SelectedConsigneeNameAfterSave { get; private set; } = string.Empty;

        public FConsignees()
        {
            InitializeComponent();
        }

        private async void FConsignees_Load(object sender, EventArgs e)
        {
            UiThemeHelper.ApplyToControlTree(this);
            btnAdd.Text = "С сервера";
            showMeContentFromConsigneesTable();
            await SyncFromServerAsync(silent: true);
        }

        void showMeContentFromConsigneesTable()
        {
            using (SQLiteConnection conConsignees = new SQLiteConnection(AppConfig.SqliteConnectionString))
            {
                string selectFromConsignees = @"
select [idConsignees] as [Id],
[codeConsignees] as [Код],
[ConsigneesName] as [Наименование],
[ConsigneesAddress] as [Адрес],
ifnull([LocationId], '') as [Location ID],
[ConsigneesUseAsDefault] as [По умолчанию]
from [Consignees]
order by [ConsigneesUseAsDefault] desc, [ConsigneesName]";
                try
                {
                    conConsignees.Open();
                    SQLiteCommand cmdShowConsigneesList = new SQLiteCommand(selectFromConsignees, conConsignees);
                    DataTable tableConsignees = new DataTable();
                    SQLiteDataAdapter daConsigneeList = new SQLiteDataAdapter(cmdShowConsigneesList);
                    daConsigneeList.Fill(tableConsignees);
                    dgvConsignees.DataSource = tableConsignees;
                    if (dgvConsignees.Columns.Contains("Id"))
                    {
                        dgvConsignees.Columns["Id"].Visible = false;
                    }

                    foreach (DataGridViewColumn column in dgvConsignees.Columns)
                    {
                        // Редактируем только адрес локально; Location ID и имя приходят с сервера.
                        column.ReadOnly = column.Name != "Адрес";
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Возникла ошибка при заполнении данных о грузополучателях.\nТекст ошибки:\n{ex}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void txtInteractiveShowMeConsignees_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                if (dgvConsignees.Rows.Count > 0 && dgvConsignees.DataSource is DataTable table)
                {
                    table.DefaultView.RowFilter = $"[Наименование] like '%{txtInteractiveShowMeConsignees.Text.Replace("'", "''")}%'";
                    if (dgvConsignees.Rows.Count == 0)
                    {
                        showMeContentFromConsigneesTable();
                    }
                }
                else
                {
                    showMeContentFromConsigneesTable();
                }
                txtInteractiveShowMeConsignees.Text = string.Empty;
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (!(dgvConsignees.DataSource is DataTable table))
            {
                return;
            }

            dgvConsignees.EndEdit();

            var selectedName = dgvConsignees.CurrentRow?.Cells["Наименование"]?.Value?.ToString()?.Trim()
                                ?? string.Empty;
            SelectedConsigneeNameAfterSave = selectedName;

            using (var connection = new SQLiteConnection(AppConfig.SqliteConnectionString))
            {
                connection.Open();
                using (var tx = connection.BeginTransaction())
                {
                    foreach (DataRow row in table.Rows)
                    {
                        if (row.RowState == DataRowState.Unchanged)
                        {
                            continue;
                        }

                        using (var cmd = new SQLiteCommand(
                            @"UPDATE Consignees
                              SET ConsigneesAddress = @address
                              WHERE idConsignees = @id",
                            connection,
                            tx))
                        {
                            cmd.Parameters.AddWithValue("@address", row["Адрес"]?.ToString() ?? string.Empty);
                            cmd.Parameters.AddWithValue("@id", Convert.ToInt64(row["Id"]));
                            cmd.ExecuteNonQuery();
                        }
                    }

                    tx.Commit();
                }
            }

            table.AcceptChanges();
            ToastNotification.ShowSuccess("Грузополучатели сохранены");

            if (!string.IsNullOrWhiteSpace(selectedName))
            {
                ConsigneeHelper.SetActiveConsignee(selectedName);
            }

            DialogResult = DialogResult.OK;
            Close();
        }

        private async void btnAdd_Click(object sender, EventArgs e)
        {
            await SyncFromServerAsync(silent: false);
        }

        private async Task SyncFromServerAsync(bool silent)
        {
            try
            {
                btnAdd.Enabled = false;
                var client = new ApiClient();
                if (!client.IsAuthenticated)
                {
                    var token = Settings.Default.stringToken;
                    if (string.IsNullOrWhiteSpace(token))
                    {
                        if (!silent)
                        {
                            UiDialogs.ShowInfo(
                                "Сначала войдите на сервер — грузополучатели подтягиваются из веб-кабинета покупателя.",
                                "Грузополучатели",
                                this);
                        }
                        return;
                    }
                    client.SetToken(token);
                }

                var locations = await client.GetBuyerLocationsAsync();
                var count = ConsigneeHelper.SyncFromServer(locations);
                showMeContentFromConsigneesTable();
                if (!silent)
                {
                    ToastNotification.ShowSuccess(count > 0
                        ? $"Обновлено грузополучателей: {count}"
                        : "На сервере пока нет грузополучателей");
                }
            }
            catch (Exception ex)
            {
                if (!silent)
                {
                    UiDialogs.ShowError($"Не удалось загрузить грузополучателей с сервера.\n{ex.Message}", "Грузополучатели", this);
                }
                else
                {
                    AppDebugLog.Error("FConsignees", "Тихая синхронизация грузополучателей не удалась", ex);
                }
            }
            finally
            {
                btnAdd.Enabled = true;
            }
        }

        private void btnSetDefault_Click(object sender, EventArgs e)
        {
            if (dgvConsignees.CurrentRow == null)
            {
                UiDialogs.ShowInfo("Выберите аптеку в списке.", "Грузополучатели", this);
                return;
            }

            var name = dgvConsignees.CurrentRow.Cells["Наименование"]?.Value?.ToString()?.Trim();
            if (string.IsNullOrWhiteSpace(name))
            {
                return;
            }

            ConsigneeHelper.SetActiveConsignee(name);
            showMeContentFromConsigneesTable();
            ToastNotification.ShowSuccess($"Аптека по умолчанию: {name}");
        }
    }
}
