using System.Net;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;

namespace AddHostToProxy
{
    internal class Program
    {
        public static List<KeyValuePair<string, string>> ListDev = new List<KeyValuePair<string, string>>();
        static async Task Main(string[] args)
        {
            ListDev = ReadCsvFile("ListDev.csv");
            string str = await GetTokenAsync();
            foreach (var item in ListDev)
            {
                var host = new HostProxy();
                var lsDomain = new List<string>();
                var _meta = new Meta();
                host.meta = _meta;
                lsDomain.Add(item.Value+"-vnk.security.local");
                host.domain_names = lsDomain;
                host.forward_host = item.Key;
                var str2 = await AddProxyHostAsync(str, host);
                Console.WriteLine($"{item.Key}\t{str2}");
            }
            Console.WriteLine("========== ЗАКОНЧИЛ ============");
            Console.ReadKey();
        }

        public static async Task<string> GetTokenAsync()
        {
            using var client = new HttpClient();

            var payload = new { identity = "admin@security.local", secret = "4NUDZhJ7" };
            var response = await client.PostAsJsonAsync("http://172.16.48.129:81/api/tokens", payload);

            if (response.IsSuccessStatusCode)
            {
                // Десериализуем ответ напрямую в динамический объект или анонимный тип
                var data = await response.Content.ReadFromJsonAsync<TokenResponse>();
                return data?.Token.ToString();
            }

            return "null";
        }

        public static async Task<string> AddProxyHostAsync(string token, object data)
        {
            using var _httpClient = new HttpClient();
            // Формируем данные запроса
            var jsonContent = JsonSerializer.Serialize(data);
            var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");

            // Устанавливаем заголовки
            _httpClient.DefaultRequestHeaders.Clear();
            _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");

            // Отправляем запрос
            var httpResponse = await _httpClient.PostAsync("http://172.16.48.129:81/api/nginx/proxy-hosts", httpContent);
            //var httpResponse = await _httpClient.PutAsync($"http://172.16.48.129:81/api/nginx/proxy-hosts", httpContent);

            // Проверяем статус ответа
            httpResponse.EnsureSuccessStatusCode();

            // Возвращаем статус-код
            return httpResponse.StatusCode.ToString();
        }

        public static List<KeyValuePair<string, string>> ReadCsvFile(string filePath)
        {
            using (var reader = new StreamReader(filePath))
            {
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    if (string.IsNullOrEmpty(line)) continue;

                    // Разбиваем строку по запятой (предполагая CSV с разделителем запятой)
                    var parts = line.Split(';');

                    // Проверяем, что строка содержит хотя бы две части
                    if (parts.Length >= 2)
                    {
                        // Приводим результаты к строкам и добавляем в список
                        ListDev.Add(new KeyValuePair<string, string>(parts[0].Trim(), parts[1].Trim()));
                    }
                }
            }

            return ListDev;
        }

        // Класс для десериализации ответа
        public record TokenResponse(string Token, DateTime Expires);

    }
    public class Meta
    {
        public bool nginx_online { get; set; } = true;
        public object nginx_err { get; set; } = null;
    }
    public class HostProxy
    {
        public bool enabled { get; set; } = true;
        public List<string> domain_names { get; set; }
        public string forward_scheme { get; set; } = "https";
        public string forward_host { get; set; }
        public int forward_port { get; set; } = 443;
        public int access_list_id { get; set; } = 0;
        public int certificate_id { get; set; } = 1;
        public bool ssl_forced { get; set; } = false;
        public bool caching_enabled { get; set; } = false;
        public bool block_exploits { get; set; } = false;
        public string advanced_config { get; set; } = "";
        public Meta meta { get; set; }
        public bool allow_websocket_upgrade { get; set; } = true;
        public bool http2_support { get; set; } = false;
        public bool hsts_enabled { get; set; } = false;
        public bool hsts_subdomains { get; set; } = false;
    }
}
