using Oracle.ManagedDataAccess.Client;
using SendNotify;
using System.Net;
using System.Text;
using System.Data.SqlClient;
internal class Program
{
    private static DateTime lastDate = DateTime.MinValue;
    private static void Main(string[] args)
    {
        while (true)
        {
            string? gotifyUrl = null;
            string? appToken_izhstal = null;
            string? proxyUrl = null;
            string? proxyUsername = null;
            string? proxyPassword = null;
            var config = File.ReadAllLines("config.txt");

            foreach (var line in config)
            {
                if (line.StartsWith("gotify_url="))
                    gotifyUrl = line.Substring("gotify_url=".Length);
                else if (line.StartsWith("app_token_izhstal="))
                    appToken_izhstal = line.Substring("app_token_izhstal=".Length);
                else if (line.StartsWith("proxy_url="))
                    proxyUrl = line.Substring("proxy_url=".Length);
                else if (line.StartsWith("proxy_username="))
                    proxyUsername = line.Substring("proxy_username=".Length);
                else if (line.StartsWith("proxy_password="))
                    proxyPassword = line.Substring("proxy_password=".Length);
            }

            if (gotifyUrl == null || appToken_izhstal == null || proxyUrl == null || proxyUsername == null || proxyPassword == null)
            {
                Console.WriteLine("Ошибка: не все параметры указаны в config.txt");
                Log.Logger("Ошибка: не все параметры указаны в config.txt");

            }
            else
                NotifyPollingAsync(gotifyUrl, appToken_izhstal, proxyUrl, proxyUsername, proxyPassword);

            Thread.Sleep(60000);
        }
    }


    private static async void NotifyPollingAsync(string url, string token, string proxyUrl, string proxyUsername, string proxyPassword)
    {
        #region check furnace 250
        DateTime now = DateTime.Now;
        var result = CheckFurnace250().Result;
        if (!result.status)
        {
            var notification = new
            {
                title = "Статус ПШП ст.250",
                message = result.msg,
                priority = 5
            };
            await SendNotify(url, token, notification, proxyUrl, proxyUsername, proxyPassword);
        }
        #endregion

        #region test msg to check
        if (now.Hour == 8 && now.Date != lastDate.Date)
        {
            var notification = new
            {
                title = "Test notify",
                message = "IS OK",
                priority = 3
            };
            await SendNotify(url, token, notification, proxyUrl, proxyUsername, proxyPassword);
            lastDate = now;
        }
        #endregion

        #region check billets 250
        result = CheckRoughToFinishedBilletCount().Result;
        if (!result.status)
        {
            var notification = new
            {
                title = "Статус мониторинга ст.250",
                message = result.msg,
                priority = 5
            };
            await SendNotify(url, token, notification, proxyUrl, proxyUsername, proxyPassword);
        }
        #endregion
    }

    private static async Task<(bool status, string msg)> CheckRoughToFinishedBilletCount()
    {
        int cntBillets = 0;
        const string sqlConn = "User Id=main;Password=main;Data Source=10.14.18.50:1521/izl2;";
        try
        {
            using (var conn = new OracleConnection(sqlConn))
            {
                await conn.OpenAsync();
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "SELECT COUNT(*) FROM V_TRACKING_MILL";
                    cntBillets = Convert.ToInt32(await command.ExecuteScalarAsync());
                }
            }
        }
        catch
        {
            return (false, "Ошибка подключения к БД Oracle ст.250!");
        }
        if (cntBillets > 15)
        {
            return (false, $"Заготовок в стане - {cntBillets}");
        }

        return (true, "OK");

    }
    private static async Task<(bool status, string msg)> CheckFurnace250()
    {
        int cntEmptyPOID = 0;
        DateTime lastDT = DateTime.Now;
        const string sqlConn = @"Password=WonderUser;User ID=WonderUser;Initial Catalog=Furnace_l2;Data Source=10.14.18.38\IZHSTALSQLSRVER;TrustServerCertificate=true;Encrypt=true;";
        
        try
        {
            using (var conn = new SqlConnection(sqlConn))
            {
                await conn.OpenAsync();
                string sqlQuery = @"SELECT COUNT(PO_ID) cnt_empty_poid, (SELECT top(1)
                                        CHARGING_TIME
                                    FROM [Furnace_l2].[dbo].[HIST_PIECES]
                                    where [IS_DISCHARGED] ='N' and
                                        datediff(day,CHARGING_TIME, Getdate()) < 1 AND
                                        RTRIM(LTRIM(PO_ID)) != ''
                                    order by CHARGING_TIME desc) last_dt
                                FROM [Furnace_l2].[dbo].[HIST_PIECES]
                                where [IS_DISCHARGED] ='N' and
                                    datediff(day,CHARGING_TIME, Getdate()) < 1 AND
                                    RTRIM(LTRIM(PO_ID)) = '';";
                using (var command = new SqlCommand(sqlQuery, conn))
                using (var dbReader = await command.ExecuteReaderAsync())
                {
                    while (await dbReader.ReadAsync())
                    {
                        cntEmptyPOID = Convert.ToInt32(dbReader.GetValue(0));
                        lastDT = Convert.ToDateTime(dbReader.GetValue(1));
                    }
                }
            }
        }
        catch
        {
            return (false, "Ошибка подключения к БД sql server печи ПШП!");
        }

        if (cntEmptyPOID > 15 && DateTime.Now - lastDT > new TimeSpan(0, 5, 0))
        {
            return (false, $"Проблема с привязкой ID заготовок в ПШП. Не привязанных - {cntEmptyPOID}, время последней привязанной - {lastDT}");
        }

        return (true, "OK");
    }

    private static async Task SendNotify(string url, string token, object notification, string proxyUrl, string proxyUsername, string proxyPassword)
    {
        var proxy = new WebProxy(new Uri(proxyUrl))
        {
            Credentials = new NetworkCredential(proxyUsername, proxyPassword, "MECHEL")
        };

        var handler = new HttpClientHandler()
        {
            Proxy = proxy,
            UseProxy = true,
            PreAuthenticate = true,
            UseDefaultCredentials = false
        };

        using (var client = new HttpClient(handler))
        {
            client.DefaultRequestHeaders.Add("X-Gotify-Key", token);

            string json = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
            var content = new StringContent(json, Encoding.UTF8, "application/json");

            try
            {
                HttpResponseMessage response = await client.PostAsync(url, content);

                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine($"{DateTime.Now} - Отправлено сообщение.");
                    Log.Logger($"Отправлено сообщение.");
                }
                else
                {
                    Console.WriteLine($"Ошибка: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}");
                    Log.Logger($"Ошибка: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}");
                }
            }
            catch (HttpRequestException ex)
            {
                Console.WriteLine($"Ошибка подключения: {ex.Message}");
                Log.Logger($"Ошибка подключения: {ex.Message}");
                if (ex.InnerException != null)
                {
                    Console.WriteLine($"Детали: {ex.InnerException.Message}");
                    Log.Logger($"Детали: {ex.InnerException.Message}");
                }
            }
        }
    }
}