﻿using System;
using System.Collections.Generic;
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 Form3 : Form
    {
        private static readonly HttpClient client;

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

        public Form3()
        {
            InitializeComponent();
            InitializeFormControls();
            LoadDropdownData();
        }

        private void InitializeFormControls()
        {
            this.Text = "Создание торгового автомата";
            this.Size = new Size(600, 900);
            this.StartPosition = FormStartPosition.CenterScreen;
            this.FormBorderStyle = FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;

            // Создаем панель с прокруткой
            var mainPanel = new Panel
            {
                Dock = DockStyle.Fill,
                AutoScroll = true,
                Padding = new Padding(20)
            };
            this.Controls.Add(mainPanel);

            int yPos = 20;
            int labelWidth = 150;
            int controlWidth = 150;
            int spacing = 60;

            // Заголовок
            var titleLabel = new Label
            {
                Text = "Создание торгового автомата",
                Font = new Font("Segoe UI", 14, FontStyle.Bold),
                ForeColor = Color.FromArgb(33, 150, 243),
                Location = new Point(20, yPos),
                AutoSize = true
            };
            mainPanel.Controls.Add(titleLabel);
            yPos += 50;

            // Название ТА *
            AddLabel(mainPanel, "Название ТА *", 20, yPos);
            txtName = AddTextBox(mainPanel, 20, yPos + 20, 500);
            yPos += spacing;

            // Производитель ТА * | Модель ТА *
            AddLabel(mainPanel, "Производитель ТА *", 20, yPos);
            AddLabel(mainPanel, "Модель ТА *", 280, yPos);
            cmbManufacturer = AddComboBox(mainPanel, 20, yPos + 20, controlWidth);
            cmbModel = AddComboBox(mainPanel, 280, yPos + 20, controlWidth);
            yPos += spacing;

            // Режим работы * | Производитель ТА (Slave) * | Модель ТА (Slave) *
            AddLabel(mainPanel, "Режим работы *", 20, yPos);
            cmbWorkingMode = AddComboBox(mainPanel, 20, yPos + 20, controlWidth);
            yPos += spacing;

            AddLabel(mainPanel, "Производитель ТА (Slave) *", 20, yPos);
            AddLabel(mainPanel, "Модель ТА (Slave) *", 280, yPos);
            txtManufacturerSlave = AddTextBox(mainPanel, 20, yPos + 20, controlWidth);
            txtModelSlave = AddTextBox(mainPanel, 280, yPos + 20, controlWidth);
            yPos += spacing;

            // Адрес * | Место * | Координаты
            AddLabel(mainPanel, "Адрес *", 20, yPos);
            txtAddress = AddTextBox(mainPanel, 20, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Место *", 190, yPos);
            txtPlace = AddTextBox(mainPanel, 190, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Координаты", 360, yPos);
            txtCoordinates = AddTextBox(mainPanel, 360, yPos + 20, controlWidth);
            yPos += spacing;

            // Номер автомата * | Время работы | Часовой пояс *
            AddLabel(mainPanel, "Номер автомата *", 20, yPos);
            txtMachineNumber = AddTextBox(mainPanel, 20, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Время работы (формат: 08:00-22:00)", 190, yPos);
            txtWorkingHours = AddTextBox(mainPanel, 190, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Часовой пояс *", 360, yPos);
            cmbTimezone = AddComboBox(mainPanel, 360, yPos + 20, controlWidth);
            yPos += spacing;

            // Товарная матрица * | Шаблон keys: значений | Шаблон наскладнений
            AddLabel(mainPanel, "Товарная матрица *", 20, yPos);
            cmbProductMatrix = AddComboBox(mainPanel, 20, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Шаблон keys: значений", 190, yPos);
            cmbKeysTemplate = AddComboBox(mainPanel, 190, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Шаблон наскладнений", 360, yPos);
            cmbStockTemplate = AddComboBox(mainPanel, 360, yPos + 20, controlWidth);
            yPos += spacing;

            // Компит | Менеджер | Инженер
            AddLabel(mainPanel, "Компит", 20, yPos);
            cmbCompany = AddComboBox(mainPanel, 20, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Менеджер", 190, yPos);
            cmbManager = AddComboBox(mainPanel, 190, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Инженер", 360, yPos);
            cmbEngineer = AddComboBox(mainPanel, 360, yPos + 20, controlWidth);
            yPos += spacing;

            // Техно-оператор | Платежные системы *
            AddLabel(mainPanel, "Техно-оператор", 20, yPos);
            cmbTechOperator = AddComboBox(mainPanel, 20, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Платежные системы *", 190, yPos);
            var paymentPanel = new FlowLayoutPanel
            {
                Location = new Point(190, yPos + 20),
                Size = new Size(320, 30),
                FlowDirection = FlowDirection.LeftToRight
            };

            chkMonetorr = new CheckBox { Text = "Монеторр", AutoSize = true };
            chkCashReader = new CheckBox { Text = "Купюрорр.", AutoSize = true };
            chkCashlessModule = new CheckBox { Text = "Модуль б/н опл.", AutoSize = true };
            chkQRPayments = new CheckBox { Text = "QR-платежи", AutoSize = true };

            paymentPanel.Controls.Add(chkMonetorr);
            paymentPanel.Controls.Add(chkCashReader);
            paymentPanel.Controls.Add(chkCashlessModule);
            paymentPanel.Controls.Add(chkQRPayments);
            mainPanel.Controls.Add(paymentPanel);
            yPos += spacing;

            // RFID карты
            AddLabel(mainPanel, "RFID карты обслуживания", 20, yPos);
            txtRFIDService = AddTextBox(mainPanel, 20, yPos + 20, controlWidth);

            AddLabel(mainPanel, "RFID карты инкассации", 190, yPos);
            txtRFIDCollection = AddTextBox(mainPanel, 190, yPos + 20, controlWidth);

            AddLabel(mainPanel, "RFID карты загрузки", 360, yPos);
            txtRFIDLoading = AddTextBox(mainPanel, 360, yPos + 20, controlWidth);
            yPos += spacing;

            // Id кассы Kit Online | Приоритет обслуживания * | Модем *
            AddLabel(mainPanel, "Id кассы Kit Online (только в случае жесткой привязки)", 20, yPos);
            txtKitOnlineId = AddTextBox(mainPanel, 20, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Приоритет обслуживания *", 190, yPos);
            cmbPriority = AddComboBox(mainPanel, 190, yPos + 20, controlWidth);

            AddLabel(mainPanel, "Модем *", 360, yPos);
            cmbModem = AddComboBox(mainPanel, 360, yPos + 20, controlWidth);
            yPos += spacing;

            // Примечания
            AddLabel(mainPanel, "Примечания", 20, yPos);
            txtNotes = new TextBox
            {
                Location = new Point(20, yPos + 20),
                Size = new Size(500, 80),
                Multiline = true,
                ScrollBars = ScrollBars.Vertical
            };
            mainPanel.Controls.Add(txtNotes);
            yPos += 120;

            // Кнопки
            var buttonPanel = new Panel
            {
                Location = new Point(20, yPos),
                Size = new Size(500, 40)
            };

            btnSave = new Button
            {
                Text = "Создать",
                Size = new Size(100, 35),
                Location = new Point(0, 0),
                BackColor = Color.FromArgb(33, 150, 243),
                ForeColor = Color.White,
                FlatStyle = FlatStyle.Flat
            };
            btnSave.Click += BtnSave_Click;

            btnCancel = new Button
            {
                Text = "Отменить",
                Size = new Size(100, 35),
                Location = new Point(110, 0),
                FlatStyle = FlatStyle.Flat
            };
            btnCancel.Click += (s, e) => this.Close();

            buttonPanel.Controls.Add(btnSave);
            buttonPanel.Controls.Add(btnCancel);
            mainPanel.Controls.Add(buttonPanel);
        }

        private Label AddLabel(Panel panel, string text, int x, int y)
        {
            var label = new Label
            {
                Text = text,
                Location = new Point(x, y),
                AutoSize = true,
                Font = new Font("Segoe UI", 9)
            };
            panel.Controls.Add(label);
            return label;
        }

        private TextBox AddTextBox(Panel panel, int x, int y, int width)
        {
            var textBox = new TextBox
            {
                Location = new Point(x, y),
                Size = new Size(width, 23)
            };
            panel.Controls.Add(textBox);
            return textBox;
        }

        private ComboBox AddComboBox(Panel panel, int x, int y, int width)
        {
            var comboBox = new ComboBox
            {
                Location = new Point(x, y),
                Size = new Size(width, 23),
                DropDownStyle = ComboBoxStyle.DropDownList
            };
            panel.Controls.Add(comboBox);
            return comboBox;
        }

        private async void LoadDropdownData()
        {
            try
            {
                // Загружаем производителей
                var manufacturersResponse = await client.GetAsync("http://127.0.0.1:8000/manufacturers");
                if (manufacturersResponse.IsSuccessStatusCode)
                {
                    var json = await manufacturersResponse.Content.ReadAsStringAsync();
                    var data = JsonSerializer.Deserialize<JsonElement>(json);
                    var manufacturers = data.GetProperty("manufacturers").EnumerateArray()
                        .Select(x => x.GetString()).ToList();

                    cmbManufacturer.Items.AddRange(manufacturers.ToArray());
                    if (manufacturers.Count > 0) cmbManufacturer.SelectedIndex = 0;
                }

                // Загружаем модели
                var modelsResponse = await client.GetAsync("http://127.0.0.1:8000/models");
                if (modelsResponse.IsSuccessStatusCode)
                {
                    var json = await modelsResponse.Content.ReadAsStringAsync();
                    var data = JsonSerializer.Deserialize<JsonElement>(json);
                    var models = data.GetProperty("models").EnumerateArray()
                        .Select(x => x.GetString()).ToList();

                    cmbModel.Items.AddRange(models.ToArray());
                    if (models.Count > 0) cmbModel.SelectedIndex = 0;
                }

                // Загружаем режимы работы
                var modesResponse = await client.GetAsync("http://127.0.0.1:8000/working-modes");
                if (modesResponse.IsSuccessStatusCode)
                {
                    var json = await modesResponse.Content.ReadAsStringAsync();
                    var data = JsonSerializer.Deserialize<JsonElement>(json);
                    var modes = data.GetProperty("modes").EnumerateArray()
                        .Select(x => x.GetString()).ToList();

                    cmbWorkingMode.Items.AddRange(modes.ToArray());
                    if (modes.Count > 0) cmbWorkingMode.SelectedIndex = 0;
                }

                // Загружаем часовые пояса
                var timezonesResponse = await client.GetAsync("http://127.0.0.1:8000/timezones");
                if (timezonesResponse.IsSuccessStatusCode)
                {
                    var json = await timezonesResponse.Content.ReadAsStringAsync();
                    var data = JsonSerializer.Deserialize<JsonElement>(json);
                    var timezones = data.GetProperty("timezones").EnumerateArray()
                        .Select(x => x.GetString()).ToList();

                    cmbTimezone.Items.AddRange(timezones.ToArray());
                    // По умолчанию UTC + 3 (Москва)
                    var moscowIndex = timezones.FindIndex(t => t.Contains("+ 3"));
                    cmbTimezone.SelectedIndex = moscowIndex >= 0 ? moscowIndex : 0;
                }

                // Загружаем компании
                var companiesResponse = await client.GetAsync("http://127.0.0.1:8000/companies");
                if (companiesResponse.IsSuccessStatusCode)
                {
                    var json = await companiesResponse.Content.ReadAsStringAsync();
                    var data = JsonSerializer.Deserialize<JsonElement>(json);
                    var companies = data.GetProperty("companies").EnumerateArray()
                        .Select(x => x.GetProperty("name").GetString()).ToList();

                    cmbCompany.Items.Add("Не задан");
                    cmbCompany.Items.AddRange(companies.ToArray());
                    cmbCompany.SelectedIndex = 0;
                }

                // Загружаем модемы
                var modemsResponse = await client.GetAsync("http://127.0.0.1:8000/modems");
                if (modemsResponse.IsSuccessStatusCode)
                {
                    var json = await modemsResponse.Content.ReadAsStringAsync();
                    var data = JsonSerializer.Deserialize<JsonElement>(json);
                    var modems = data.GetProperty("modems").EnumerateArray()
                        .Select(x => x.GetProperty("serial_number").GetString()).ToList();

                    cmbModem.Items.Add("Не задан");
                    cmbModem.Items.AddRange(modems.ToArray());
                    cmbModem.SelectedIndex = 0;
                }

                // Загружаем приоритеты
                var prioritiesResponse = await client.GetAsync("http://127.0.0.1:8000/priorities");
                if (prioritiesResponse.IsSuccessStatusCode)
                {
                    var json = await prioritiesResponse.Content.ReadAsStringAsync();
                    var data = JsonSerializer.Deserialize<JsonElement>(json);
                    var priorities = data.GetProperty("priorities").EnumerateArray()
                        .Select(x => x.GetString()).ToList();

                    cmbPriority.Items.AddRange(priorities.ToArray());
                    if (priorities.Count > 0) cmbPriority.SelectedIndex = 0;
                }

                // Заполняем остальные ComboBox заглушками
                cmbProductMatrix.Items.AddRange(new[] { "Не установлена", "Матрица 1", "Матрица 2" });
                cmbProductMatrix.SelectedIndex = 0;

                cmbKeysTemplate.Items.AddRange(new[] { "Не установлен", "Шаблон 1", "Шаблон 2" });
                cmbKeysTemplate.SelectedIndex = 0;

                cmbStockTemplate.Items.AddRange(new[] { "Не установлен", "Шаблон 1", "Шаблон 2" });
                cmbStockTemplate.SelectedIndex = 0;

                cmbManager.Items.AddRange(new[] { "Не задан", "Иванов И.И.", "Петров П.П." });
                cmbManager.SelectedIndex = 0;

                cmbEngineer.Items.AddRange(new[] { "Не задан", "Сидоров С.С.", "Козлов К.К." });
                cmbEngineer.SelectedIndex = 0;

                cmbTechOperator.Items.AddRange(new[] { "Не задан", "Оператор 1", "Оператор 2" });
                cmbTechOperator.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка загрузки данных: {ex.Message}", "Ошибка");
            }
        }

        private async void BtnSave_Click(object sender, EventArgs e)
        {
            // Валидация обязательных полей
            if (string.IsNullOrWhiteSpace(txtName.Text))
            {
                MessageBox.Show("Введите название ТА", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrWhiteSpace(txtAddress.Text))
            {
                MessageBox.Show("Введите адрес", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrWhiteSpace(txtPlace.Text))
            {
                MessageBox.Show("Введите место", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrWhiteSpace(txtMachineNumber.Text))
            {
                MessageBox.Show("Введите номер автомата", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (!chkMonetorr.Checked && !chkCashReader.Checked && !chkCashlessModule.Checked && !chkQRPayments.Checked)
            {
                MessageBox.Show("Выберите хотя бы одну платежную систему", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                btnSave.Enabled = false;
                btnSave.Text = "Создание...";

                // Формируем данные для отправки
                var machineData = new
                {
                    name = txtName.Text,
                    serial_number = int.Parse(txtMachineNumber.Text),
                    inventory_number = int.Parse(txtMachineNumber.Text) + 1000, // Для примера
                    model = cmbModel.SelectedItem?.ToString() ?? "",
                    manufacturer = cmbManufacturer.SelectedItem?.ToString() ?? "",
                    country = "Россия", // По умолчанию
                    resource_hours = 10000, // По умолчанию
                    type = "Snacks", // По умолчанию
                    company_id = cmbCompany.SelectedIndex > 0 ? cmbCompany.SelectedIndex : (int?)null,
                    modem_id = cmbModem.SelectedIndex > 0 ? cmbModem.SelectedIndex : (int?)null,
                    address = $"{txtAddress.Text}, {txtPlace.Text}",
                    installation_date = DateTime.Now.ToString("yyyy-MM-dd")
                };

                var json = JsonSerializer.Serialize(machineData);
                var content = new StringContent(json, Encoding.UTF8, "application/json");

                var response = await client.PostAsync("http://127.0.0.1:8000/vending-machines", content);
                var responseText = await response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    MessageBox.Show("Торговый автомат успешно создан!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.DialogResult = DialogResult.OK;
                    this.Close();
                }
                else
                {
                    MessageBox.Show($"Ошибка создания: {responseText}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (FormatException)
            {
                MessageBox.Show("Номер автомата должен быть числом", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                btnSave.Enabled = true;
                btnSave.Text = "Создать";
            }
        }

        // Поля формы
        private TextBox txtName, txtManufacturerSlave, txtModelSlave, txtAddress, txtPlace;
        private TextBox txtCoordinates, txtMachineNumber, txtWorkingHours;
        private TextBox txtRFIDService, txtRFIDCollection, txtRFIDLoading, txtKitOnlineId, txtNotes;
        private ComboBox cmbManufacturer, cmbModel, cmbWorkingMode, cmbTimezone;
        private ComboBox cmbProductMatrix, cmbKeysTemplate, cmbStockTemplate;
        private ComboBox cmbCompany, cmbManager, cmbEngineer, cmbTechOperator, cmbPriority, cmbModem;
        private CheckBox chkMonetorr, chkCashReader, chkCashlessModule, chkQRPayments;
        private Button btnSave, btnCancel;
    }
}