using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Data.Repository;
using Demo.Domain.UseCase;
using Demo.UI;
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Demo.Domain.Models;

namespace Demo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Добавляем сервисы в контейнер
            builder.Services.AddControllers();
            builder.Services.AddScoped<IUserRepository, SQLUserRepositoryImpl>();
            builder.Services.AddScoped<IGroupRepository, SQLGroupRepositoryImpl>();
            builder.Services.AddScoped<IPresenceRepository, SQLPresenceRepository>();
            builder.Services.AddScoped<UserUseCase>();
            builder.Services.AddScoped<GroupUseCase>();
            builder.Services.AddScoped<UseCasePresence>();

            // Добавляем контекст базы данных
            builder.Services.AddDbContext<RemoteDatabaseContext>(options =>
                options.UseNpgsql("Host=45.67.56.214;Port=5421;Username=user5;Database=user5;Password=EtEJqhsf"));

            // Добавляем Swagger
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Настройка конвейера обработки запросов
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

            // Инициализация данных
            using (var scope = app.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                var dbContext = services.GetRequiredService<RemoteDatabaseContext>();
                DataInitializer.Initialize(dbContext);
            }

            // Запуск консольного меню
            using (var scope = app.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                var context = services.GetRequiredService<RemoteDatabaseContext>();
                var userRepository = new SQLUserRepositoryImpl(context);
                var groupRepository = new SQLGroupRepositoryImpl(context);
                var presenceRepository = new SQLPresenceRepository(context);

                var userUseCase = new UserUseCase(userRepository);
                var groupUseCase = new GroupUseCase(groupRepository);
                var presenceUseCase = new UseCasePresence(presenceRepository);

                var userConsole = new UserConsole(userUseCase);
                var groupConsole = new GroupConsole(groupUseCase);
                var presenceConsole = new PresenceConsole(presenceUseCase, userUseCase); // Передаем userUseCase
                var excelExporter = new ExcelExporter();

                // Создаем данные для экспорта
                var group = new Group { Name = "Group 1" };
                var users = new List<User> { new User { Id = Guid.NewGuid(), FIO = "User 1" } }; // Используем Guid для Id
                var presence = new List<Presence> { new Presence { UserId = users[0].Id, IsAttendance = true } };

                // Указываем путь для сохранения файла
                string directoryPath = @"C:\Users\class_Student\Source\Repos\slarny4\Demo1\Excel";
                string filePath = Path.Combine(directoryPath, "GroupInfo.xlsx");

                // Проверяем, существует ли директория, и если нет, создаем её
                if (!Directory.Exists(directoryPath))
                {
                    Directory.CreateDirectory(directoryPath);
                }

                // Вызываем метод для экспорта данных в Excel
                excelExporter.ExportGroupInfoToExcel(group, users, presence, filePath);

                var mainMenu = new MainMenu(userConsole, groupConsole, presenceConsole, excelExporter, groupUseCase, userUseCase, presenceUseCase);
                mainMenu.ShowMenu();
            }

            // Запуск веб-сервера асинхронно
            var url = "http://localhost:5000";
            var serverTask = app.RunAsync(url);

            // Открытие браузера с Swagger UI после запуска сервера
            await Task.Delay(1000); // Небольшая задержка, чтобы сервер успел запуститься
            OpenBrowser(url + "/swagger");

            // Ожидание завершения сервера
            await serverTask;
        }

        private static void OpenBrowser(string url)
        {
            try
            {
                Process.Start(url);
            }
            catch
            {
                // Если запуск через Process.Start не работает, попробуем другой метод
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    url = url.Replace("&", "^&");
                    Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
                }
                else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
                {
                    Process.Start("xdg-open", url);
                }
                else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                {
                    Process.Start("open", url);
                }
                else
                {
                    throw;
                }
            }
        }
    }
}