using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.SQLite;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Text;
//using System.Net.Http.json;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using System.Windows.Forms;
using Электронная_Фармация.Classes;
using Электронная_Фармация.Properties;

namespace Электронная_Фармация.HelpForms
{
    public partial class HF_DownloadDataFromServer : Form
    {
        public HF_DownloadDataFromServer()
        {
            InitializeComponent();
        }

        string login = Settings.Default.stringLogin.ToString();
        string password = Settings.Default.stringPassword.ToString();

        string connectionStringToLocalDB = AppConfig.SqliteConnectionString;

        private async void HF_DownloadDataFromServer_Load(object sender, EventArgs e)
        {
            UiThemeHelper.ApplyToControlTree(this);
            btnCloseThis.Enabled = false;
            rtxtDebug.Visible = false;
            dataGridView1.Visible = false;

            var client = new ApiClient();
            try
            {
                if (!string.IsNullOrWhiteSpace(Settings.Default.stringToken))
                {
                    client.SetToken(Settings.Default.stringToken);
                    rtxtDebug.Text += "Используется сохранённый токен...\n";
                }
                else
                {
                    rtxtDebug.Text += "Выполняю авторизацию...\n";
                    var token = await client.LoginAsync(login, password);
                    Settings.Default.stringToken = token;
                    Settings.Default.Save();
                    rtxtDebug.Text += "Авторизация успешно пройдена\n";
                }

                rtxtDebug.Text += "\nЗагружаю сводный прайс для всех поставщиков...";
                var allSuppliersSummary = await client.GetPriceSummaryAsync(
                    supplierId: null,
                    regionId: string.IsNullOrWhiteSpace(Settings.Default.RegionId) ? null : Settings.Default.RegionId);
                rtxtDebug.Text += ($"✓ Получено {allSuppliersSummary.Summary.Count} позиций\n");


                    //загружаю один товар:
                    //rtxtDebug.Text += ("\nЗагружаю сводный прайс для всех поставщиков...");
                    //    var PriceItem = await client.GetPriceItem();
                        //rtxtDebug.Text += ($"✓ Получено {allSuppliersSummary.DrugName.Count} позиций\n");

                        DataTable tablePrice = new DataTable();

                        tablePrice.Columns.Add("supplier_price_id");
                        tablePrice.Columns.Add("guid_es");
                        tablePrice.Columns.Add("es_code");
                        tablePrice.Columns.Add("supplier_id");
                        tablePrice.Columns.Add("DrugName");
                        tablePrice.Columns.Add("SupplierName");
                        tablePrice.Columns.Add("Price");
                        tablePrice.Columns.Add("Quantity");

                        tablePrice.Columns.Add(new DataColumn
                        {
                            ColumnName = "ExpiryPeriod",
                            DataType = typeof(string),
                            AllowDBNull = true
                        });

                        tablePrice.Columns.Add(new DataColumn
                        {
                            ColumnName = "Description",
                            DataType = typeof(string),
                            AllowDBNull = true
                        });

                        //DataColumn colExpiryPeriod = new DataColumn("ExpiryPeriod", typeof(DateTime));
                        //DataColumn colDescription = new DataColumn("Description", typeof(string));

                        //colExpiryPeriod.AllowDBNull = true;
                        //colDescription.AllowDBNull = true;


                        ////tablePrice.Columns.Add(colExpiryPeriod);
                        //tablePrice.Columns.Add(colDescription);


                        tablePrice.Columns.Add("Zakaz");
                        tablePrice.Columns.Add("SummaZakaza");


                    #region полная таблица
                    //tablePrice.Columns.Add("GuidEs");
                    //tablePrice.Columns.Add("SupplierId");
                    //tablePrice.Columns.Add("SupplierName");
                    //tablePrice.Columns.Add("DrugName");
                    //tablePrice.Columns.Add("Inn");
                    //tablePrice.Columns.Add("CureForm");
                    //tablePrice.Columns.Add("Barcode");
                    //tablePrice.Columns.Add("Price");
                    //tablePrice.Columns.Add("Quantity");
                    //tablePrice.Columns.Add("RegionId");
                    //tablePrice.Columns.Add("RegionName");
                    //tablePrice.Columns.Add("LastPriceDate");
                    //tablePrice.Columns.Add("MatchMethod");
                    //tablePrice.Columns.Add("MatchConfidence");
                    //tablePrice.Columns.Add("TradeName");
                    //tablePrice.Columns.Add("Dosage");
                    //tablePrice.Columns.Add("RegistryPrice");
                    //tablePrice.Columns.Add("InstructionGuid");
                    //tablePrice.Columns.Add("Description");
                    //tablePrice.Columns.Add("StoringCondition");
                    //tablePrice.Columns.Add("ExpiryPeriod");
                    //tablePrice.Columns.Add("ProducerName");
                    //tablePrice.Columns.Add("RegistryDate");
                    //tablePrice.Columns.Add("EsCode");
                    //tablePrice.Columns.Add("RegistryStatus");
                    #endregion

                    // Выводим первые 5 позиций
                    //Console.WriteLine("Первые 500 позиций:");

                    #region загрузка одного элемента
                    //if (PriceItem.DrugName != null | PriceItem.DrugName != "" | PriceItem.DrugName != string.Empty)
                    //{
                        
                    //        Console.WriteLine(PriceItem.ToString());

                    //        DataRow row = tablePrice.NewRow();

                    //        row["supplier_price_id"] = PriceItem.SupplierPriceID.ToString();
                    //        row["guid_es"] = PriceItem.GuidEs.ToString();
                    //        row["es_code"] = PriceItem.EsCode.ToString();
                    //        row["supplier_id"] = PriceItem.SupplierId.ToString();
                    //        row["DrugName"] = PriceItem.DrugName.ToString();
                    //        row["SupplierName"] = "Катрен";//PriceItem.SupplierName.ToString();
                    //        row["Price"] = PriceItem.Price.ToString();
                    //        row["Quantity"] = PriceItem.Quantity.ToString();

                    //        if (PriceItem.ExpiryPeriod == null)
                    //        { row["ExpiryPeriod"] = DBNull.Value; }
                    //        else { row["ExpiryPeriod"] = PriceItem.ExpiryPeriod.ToString(); }
                    //                ;

                    //        if (PriceItem.Description == null)
                    //        { row["Description"] = DBNull.Value; }
                    //        else { row["Description"] = PriceItem.Description.ToString(); }
                    //                ;

                    //        row["Zakaz"] = string.Empty;
                    //        row["SummaZakaza"] = string.Empty;

                    //        tablePrice.Rows.Add(row);
                    //}
                    #endregion


                    #region загрузка всего прайса РАБОЧАЯ
                    if (allSuppliersSummary.Summary != null)
                    {

                        foreach (var item in allSuppliersSummary.Summary)
                        {

                            DataRow row = tablePrice.NewRow();

                            row["supplier_price_id"] = item.SupplierPriceID.ToString();
                            row["guid_es"] = item.GuidEs.ToString();
                            row["es_code"] = item.EsCode.ToString();
                            row["supplier_id"] = item.SupplierId.ToString();
                            row["DrugName"] = item.DrugName.ToString();
                            row["SupplierName"] = item.SupplierName.ToString();
                            row["Price"] = item.Price.ToString();
                            row["Quantity"] = item.Quantity.ToString();

                            if (item.ExpiryPeriod == null)
                            { row["ExpiryPeriod"] = DBNull.Value; }
                            else { row["ExpiryPeriod"] = item.ExpiryPeriod.ToString(); }
                            ;

                            if (item.Description == null)
                            { row["Description"] = DBNull.Value; }
                            else { row["Description"] = item.Description.ToString(); }
                            ;

                            row["Zakaz"] = string.Empty;
                            row["SummaZakaza"] = string.Empty;

                            tablePrice.Rows.Add(row);

                            // DataSetPriceList.Tables.Add(tablePrice);
                            // DataSetPriceList.WriteXml("PriceList.xml", XmlWriteMode.WriteSchema);



                            //SQLiteDataAdapter sqlite_data = new SQLiteDataAdapter();
                            //new SQLiteCommandBuilder(sqlite_data);
                            ////sqlite_data.Fill(tablePrice);
                            //sqlite_data.Update(tablePrice);
                            //dataGridView1.DataSource = tablePrice;



                            #region сводный прайс и статистика
                            //// Шаг 3: Получение сводного прайса для конкретного поставщика
                            //if (allSuppliersSummary.Summary.Any())
                            //{
                            //    var firstSupplierId = allSuppliersSummary.Summary
                            //        .FirstOrDefault(s => !string.IsNullOrEmpty(s.SupplierId))?.SupplierId;

                            //    if (!string.IsNullOrEmpty(firstSupplierId))
                            //    {
                            //        Console.WriteLine($"\nЗагружаю прайс для поставщика {firstSupplierId}...");
                            //        var supplierSummary = await client.GetPriceSummaryAsync(supplierId: firstSupplierId);
                            //        Console.WriteLine($"✓ Получено {supplierSummary.Summary.Count} позиций для поставщика\n");
                            //    }
                            //}

                            //// Шаг 4: Статистика
                            //Console.WriteLine("\n=== Статистика ===");
                            //var withPrice = allSuppliersSummary.Summary.Where(s => s.Price.HasValue).ToList();
                            //var withQuantity = allSuppliersSummary.Summary.Where(s => s.Quantity.HasValue).ToList();

                            //Console.WriteLine($"Всего позиций: {allSuppliersSummary.Summary.Count}");
                            //Console.WriteLine($"С ценой: {withPrice.Count}");
                            //Console.WriteLine($"С количеством: {withQuantity.Count}");


                            //if (withPrice.Any())
                            //{
                            //    var avgPrice = withPrice.Average(s => s.Price.Value);
                            //    var minPrice = withPrice.Min(s => s.Price.Value);
                            //    var maxPrice = withPrice.Max(s => s.Price.Value);

                            //    Console.WriteLine($"Средняя цена: {avgPrice:F2} ₽");
                            //    Console.WriteLine($"Минимальная цена: {minPrice:F2} ₽");
                            //    Console.WriteLine($"Максимальная цена: {maxPrice:F2} ₽");
                            //}
                            #endregion
                        }
                    }
                    #endregion

                    string commandToDelete = "delete from [PriceList]";
                    string commandTODeleteTempOrder = "delete from [TempOrderItems]";


                    string commandToInsert = @"INSERT INTO [PriceList] (
[guid_es],
[es_code],
[supplier_id],
[DrugName],
[SupplierName],
[Price],
[Quantity],
[ExpiryPeriod],
[Description],
[Zakaz],
[SummaZakaza],
[supplier_price_id]
)
VALUES
(
@guid_es,
@es_code,
@supplier_id,
@DrugName,
@SupplierName,
@Price,
@Quantity,
@ExpiryPeriod,
@Description,
@Zakaz,
@SummaZakaza,
@supplier_price_id
)
";

                        using (SQLiteConnection sqliteCon = new SQLiteConnection(connectionStringToLocalDB))
                        {
                            sqliteCon.Open();

                            SQLiteCommand cmdDeleteBeforeInsert = new SQLiteCommand(commandToDelete, sqliteCon);
                            SQLiteCommand cmdDeleteTempOrder = new SQLiteCommand(commandTODeleteTempOrder, sqliteCon);    

                            cmdDeleteBeforeInsert.ExecuteNonQuery();
                            cmdDeleteTempOrder.ExecuteNonQuery();

                            using (var transaction = sqliteCon.BeginTransaction())
                            {
                                foreach (DataRow row in tablePrice.Rows) 
                                {
                                    using (SQLiteCommand cmd = new SQLiteCommand(commandToInsert, sqliteCon, transaction))
                                    {
                                        cmd.Parameters.AddWithValue("@guid_es", row["guid_es"]);
                                        cmd.Parameters.AddWithValue("@es_code", row["es_code"]);
                                        cmd.Parameters.AddWithValue("@supplier_id", row["supplier_id"]);
                                        cmd.Parameters.AddWithValue("@DrugName", row["DrugName"]);
                                        cmd.Parameters.AddWithValue("@SupplierName", row["SupplierName"]);
                                        cmd.Parameters.AddWithValue("@Price", row["Price"]);
                                        cmd.Parameters.AddWithValue("@Quantity", row["Quantity"]);
                                        cmd.Parameters.AddWithValue("@ExpiryPeriod", row["ExpiryPeriod"]);
                                        cmd.Parameters.AddWithValue("@Description", row["Description"]);
                                        cmd.Parameters.AddWithValue("@Zakaz", row["Zakaz"]);
                                        cmd.Parameters.AddWithValue("@SummaZakaza", row["SummaZakaza"]);
                                        cmd.Parameters.AddWithValue("@supplier_price_id", row["supplier_price_id"]);
                                        cmd.ExecuteNonQuery();
                                    }
                                }
                                transaction.Commit();
                            }
                            sqliteCon.Close();
                        }

                DialogResult = DialogResult.OK;
                ToastNotification.ShowSuccess($"Прайс обновлён: {tablePrice.Rows.Count} позиций");
            }
            catch (UnauthorizedAccessException ex)
            {
                ToastNotification.ShowError($"Ошибка авторизации: {ex.Message}");
            }
            catch (HttpRequestException ex)
            {
                ToastNotification.ShowError($"Ошибка сети: {ex.Message}");
            }
            catch (Exception ex)
            {
                ToastNotification.ShowError($"Ошибка загрузки прайса: {ex.Message}");
            }

            btnCloseThis.Enabled = true;
        }

        private void HF_DownloadDataFromServer_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Dispose();
            this.Close();
        }

        private void btnCloseThis_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
