﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormsApp2
{
    public partial class UserControl2 : UserControl
    {
        private static readonly HttpClient client;
        private int currentPage = 1;
        private int pageSize = 10;
        private int totalRecords = 0;
        private int totalPages = 0;
        private string searchText = "";
        private int? selectedCompanyId = null;

        static UserControl2()
        {
            var handler = new HttpClientHandler
            {
                UseProxy = false
            };
            client = new HttpClient(handler);
        }

        public UserControl2()
        {
            InitializeComponent();
            InitializeControls();
        }

        private void InitializeControls()
        {
            // Настройка DataGridView
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.ReadOnly = true;
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.MultiSelect = false;
            dataGridView1.BackgroundColor = Color.White;
            dataGridView1.BorderStyle = BorderStyle.Fixed3D;
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(240, 240, 240);

            // Создаем колонки
            dataGridView1.Columns.Clear();

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
            {
                Name = "id",
                HeaderText = "ID",
                DataPropertyName = "id",
                Width = 50
            });

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
            {
                Name = "name",
                HeaderText = "Название",
                DataPropertyName = "name",
                Width = 150
            });

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
            {
                Name = "model",
                HeaderText = "Модель",
                DataPropertyName = "model",
                Width = 120
            });

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
            {
                Name = "company_name",
                HeaderText = "Компания",
                DataPropertyName = "company_name",
                Width = 150
            });

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
            {
                Name = "modem_serial",
                HeaderText = "Модем",
                DataPropertyName = "modem_serial",
                Width = 100
            });

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
            {
                Name = "address",
                HeaderText = "Адрес/Место",
                DataPropertyName = "address",
                Width = 250
            });

            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
            {
                Name = "installation_date",
                HeaderText = "В работе с",
                DataPropertyName = "installation_date",
                Width = 100
            });

            // Колонка с кнопками действий
            var actionsColumn = new DataGridViewButtonColumn
            {
                Name = "actions",
                HeaderText = "Действия",
                Text = "...",
                UseColumnTextForButtonValue = true,
                Width = 80
            };
            dataGridView1.Columns.Add(actionsColumn);

            // Обработчик клика по кнопке действий
            dataGridView1.CellContentClick += DataGridView1_CellContentClick;

            // Настройка ComboBox для количества строк
            comboBoxPageSize.Items.AddRange(new object[] { 5, 10, 20, 50 });
            comboBoxPageSize.SelectedItem = 10;
            comboBoxPageSize.SelectedIndexChanged += ComboBoxPageSize_SelectedIndexChanged;

            // Настройка поиска
            textBoxSearch.TextChanged += TextBoxSearch_TextChanged;

            // Настройка кнопок пагинации
            buttonPrevPage.Click += (s, e) => ChangePage(-1);
            buttonNextPage.Click += (s, e) => ChangePage(1);

            // Кнопка обновления
            buttonRefresh.Click += async (s, e) => await LoadVendingMachines();
            var buttonAdd = new Button
            {
                Text = "Добавить ТА",
                Size = new Size(120, 27),
                Location = new Point(750, 38),
                BackColor = Color.FromArgb(33, 150, 243),
                ForeColor = Color.White,
                FlatStyle = FlatStyle.Flat
            };
            buttonAdd.Click += ButtonAdd_Click;
            panelFilters.Controls.Add(buttonAdd);
            // Загрузка компаний для фильтра
            LoadCompanies();
        }

        private async void ButtonAdd_Click(object sender, EventArgs e)
        {
            var form3 = new Form3();
            if (form3.ShowDialog() == DialogResult.OK)
            {
                await LoadVendingMachines();
            }
        }

        private async void UserControl2_Load(object sender, EventArgs e)
        {
            await LoadVendingMachines();
        }

        private async Task LoadVendingMachines()
        {
            try
            {
                labelLoading.Visible = true;
                labelLoading.Text = "Загрузка...";

                var url = $"http://127.0.0.1:8000/vending-machines?page={currentPage}&page_size={pageSize}";

                if (!string.IsNullOrEmpty(searchText))
                {
                    url += $"&search={Uri.EscapeDataString(searchText)}";
                }

                if (selectedCompanyId.HasValue)
                {
                    url += $"&company_id={selectedCompanyId.Value}";
                }

                var response = await client.GetAsync(url);
                var responseText = await response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    var result = JsonSerializer.Deserialize<JsonElement>(responseText);

                    totalRecords = result.GetProperty("total").GetInt32();
                    totalPages = result.GetProperty("total_pages").GetInt32();

                    var dataArray = result.GetProperty("data").EnumerateArray();
                    var dataTable = new DataTable();

                    // Создаем колонки
                    dataTable.Columns.Add("id", typeof(int));
                    dataTable.Columns.Add("name", typeof(string));
                    dataTable.Columns.Add("model", typeof(string));
                    dataTable.Columns.Add("company_name", typeof(string));
                    dataTable.Columns.Add("modem_serial", typeof(string));
                    dataTable.Columns.Add("address", typeof(string));
                    dataTable.Columns.Add("installation_date", typeof(string));

                    // Заполняем данными
                    foreach (var item in dataArray)
                    {
                        var row = dataTable.NewRow();
                        row["id"] = item.GetProperty("id").GetInt32();
                        row["name"] = item.GetProperty("name").GetString();
                        row["model"] = item.GetProperty("model").GetString();
                        row["company_name"] = item.GetProperty("company_name").GetString() ?? "";
                        row["modem_serial"] = item.GetProperty("modem_serial").GetString();
                        row["address"] = item.GetProperty("address").GetString() ?? "";

                        var installDate = item.GetProperty("installation_date").GetString();
                        row["installation_date"] = string.IsNullOrEmpty(installDate) ? "" :
                            DateTime.Parse(installDate).ToString("dd.MM.yyyy");

                        dataTable.Rows.Add(row);
                    }

                    dataGridView1.DataSource = dataTable;

                    // Обновляем информацию о пагинации
                    var startRecord = totalRecords == 0 ? 0 : (currentPage - 1) * pageSize + 1;
                    var endRecord = Math.Min(currentPage * pageSize, totalRecords);
                    labelRecordInfo.Text = $"Показано {startRecord}-{endRecord} из {totalRecords} записей";
                    labelPageInfo.Text = $"Страница {currentPage} из {totalPages}";

                    // Управление кнопками пагинации
                    buttonPrevPage.Enabled = currentPage > 1;
                    buttonNextPage.Enabled = currentPage < totalPages;
                }
                else
                {
                    MessageBox.Show($"Ошибка загрузки данных: {responseText}", "Ошибка");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка");
            }
            finally
            {
                labelLoading.Visible = false;
            }
        }

        private async void LoadCompanies()
        {
            try
            {
                var response = await client.GetAsync("http://127.0.0.1:8000/companies");
                var responseText = await response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    var result = JsonSerializer.Deserialize<JsonElement>(responseText);
                    var companies = result.GetProperty("companies").EnumerateArray();

                    comboBoxCompanyFilter.Items.Clear();
                    comboBoxCompanyFilter.Items.Add("Все компании");

                    foreach (var company in companies)
                    {
                        var id = company.GetProperty("id").GetInt32();
                        var name = company.GetProperty("name").GetString();
                        comboBoxCompanyFilter.Items.Add(new ComboBoxItem { Text = name, Value = id });
                    }

                    comboBoxCompanyFilter.SelectedIndex = 0;
                    comboBoxCompanyFilter.SelectedIndexChanged += ComboBoxCompanyFilter_SelectedIndexChanged;
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"Ошибка загрузки компаний: {ex.Message}");
            }
        }

        private async void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0) return;

            if (dataGridView1.Columns[e.ColumnIndex].Name == "actions")
            {
                var machineId = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells["id"].Value);
                var machineName = dataGridView1.Rows[e.RowIndex].Cells["name"].Value.ToString();

                // Показываем контекстное меню с действиями
                var contextMenu = new ContextMenuStrip();

                var editItem = new ToolStripMenuItem("Редактировать");
                editItem.Click += (s, ev) => EditMachine(machineId);

                var detachModemItem = new ToolStripMenuItem("Отвязать модем");
                detachModemItem.Click += async (s, ev) => await DetachModem(machineId, machineName);

                var deleteItem = new ToolStripMenuItem("Удалить");
                deleteItem.Click += async (s, ev) => await DeleteMachine(machineId, machineName);

                contextMenu.Items.AddRange(new ToolStripItem[] { editItem, detachModemItem, deleteItem });

                // Показываем меню в позиции курсора
                var position = dataGridView1.PointToClient(Cursor.Position);
                contextMenu.Show(dataGridView1, position);
            }
        }

        private void EditMachine(int machineId)
        {
            MessageBox.Show($"Редактирование автомата ID: {machineId}\n(Функционал в разработке)", "Редактирование");
            // TODO: Открыть форму редактирования
        }

        private async Task DetachModem(int machineId, string machineName)
        {
            var result = MessageBox.Show(
                $"Вы уверены, что хотите отвязать модем от автомата '{machineName}'?",
                "Подтверждение отвязки модема",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question
            );

            if (result == DialogResult.Yes)
            {
                try
                {
                    var response = await client.PostAsync(
                        $"http://127.0.0.1:8000/vending-machines/{machineId}/detach-modem",
                        null
                    );

                    var responseText = await response.Content.ReadAsStringAsync();

                    if (response.IsSuccessStatusCode)
                    {
                        MessageBox.Show("Модем успешно отвязан", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        await LoadVendingMachines();
                    }
                    else
                    {
                        MessageBox.Show($"Ошибка отвязки модема: {responseText}", "Ошибка");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка");
                }
            }
        }

        private async Task DeleteMachine(int machineId, string machineName)
        {
            var result = MessageBox.Show(
                $"Вы уверены, что хотите удалить автомат '{machineName}'?\nЭто действие нельзя отменить!",
                "Подтверждение удаления",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Warning
            );

            if (result == DialogResult.Yes)
            {
                try
                {
                    var response = await client.DeleteAsync(
                        $"http://127.0.0.1:8000/vending-machines/{machineId}"
                    );

                    var responseText = await response.Content.ReadAsStringAsync();

                    if (response.IsSuccessStatusCode)
                    {
                        MessageBox.Show("Автомат успешно удален", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        await LoadVendingMachines();
                    }
                    else
                    {
                        MessageBox.Show($"Ошибка удаления: {responseText}", "Ошибка");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка");
                }
            }
        }

        private async void ChangePage(int delta)
        {
            var newPage = currentPage + delta;
            if (newPage >= 1 && newPage <= totalPages)
            {
                currentPage = newPage;
                await LoadVendingMachines();
            }
        }

        private async void ComboBoxPageSize_SelectedIndexChanged(object sender, EventArgs e)
        {
            pageSize = (int)comboBoxPageSize.SelectedItem;
            currentPage = 1;
            await LoadVendingMachines();
        }

        private System.Windows.Forms.Timer searchTimer;

        private void TextBoxSearch_TextChanged(object sender, EventArgs e)
        {
            // Используем таймер для задержки поиска (debounce)
            if (searchTimer == null)
            {
                searchTimer = new System.Windows.Forms.Timer { Interval = 500 };
                searchTimer.Tick += async (s, ev) =>
                {
                    searchTimer.Stop();
                    searchText = textBoxSearch.Text;
                    currentPage = 1;
                    await LoadVendingMachines();
                };
            }

            searchTimer.Stop();
            searchTimer.Start();
        }

        private async void ComboBoxCompanyFilter_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxCompanyFilter.SelectedIndex == 0)
            {
                selectedCompanyId = null;
            }
            else
            {
                var selectedItem = comboBoxCompanyFilter.SelectedItem as ComboBoxItem;
                selectedCompanyId = selectedItem?.Value;
            }

            currentPage = 1;
            await LoadVendingMachines();
        }

        // Вспомогательный класс для ComboBox
        private class ComboBoxItem
        {
            public string Text { get; set; }
            public int Value { get; set; }

            public override string ToString()
            {
                return Text;
            }
        }
    }
}