using Microsoft.AspNetCore.Mvc;
using System.Text;


var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.MapGet("/Employees/", () =>
{
    var result = Storage.Employees.Select(r => new worker_2.Models.Employee.GetList.EmployeeResult()
    {
        CompanyId = r.CompanyId,
        FullName = r.FullName,
        BirthDate = r.BirthDate,
        EmployeeId = r.EmployeeId,
        Position = r.Position,
    }).ToArray();

    return Results.Ok(result);
})
.WithName("List")
.WithOpenApi();

app.MapGet("/Employees/{employeeId}", (Guid employeeId) =>
{
    var employee = Storage.Employees.FirstOrDefault(r => r.EmployeeId == employeeId);
    if (employee is null)
    {
        return Results.NotFound($"Не найден работник {employeeId}");
    }

    return Results.Json(new worker_2.Models.Employee.Get.EmployeeResult()
    {
        CompanyId = employee.CompanyId,
        FullName = employee.FullName,
        BirthDate = employee.BirthDate,
        EmployeeId = employee.EmployeeId,
        Position = employee.Position,
    });
})
.WithName("Get")
.WithOpenApi();

app.MapPost("/Employees/", ([FromBody] worker_2.Models.Employee.Create.EmployeeForm request) =>
{
    if (Storage.Companies.FirstOrDefault(x => x.CompanyId == request.CompanyId) is null)
    {
        return Results.NotFound($"Не найдена компания {request.CompanyId}");
    }
    Guid employeeId = Guid.NewGuid();
    Storage.Employees.Add(new EmployeeDal()
    {
        EmployeeId = employeeId,
        BirthDate = request.BirthDate,
        CompanyId = request.CompanyId,
        FullName = request.FullName,
        Position = request.Position,
    });

    return Results.Ok(employeeId);
})
.WithName("Create")
.WithOpenApi();

app.MapPatch("/Employees/{employeeId}", (Guid employeeId, [FromBody] worker_2.Models.Employee.Create.EmployeeForm request) =>
{
    var employee = Storage.Employees.FirstOrDefault(r => r.EmployeeId == employeeId);
    if (employee is null)
    {
        return Results.NotFound($"Не найден работник {employeeId}");
    }

    if(Storage.Companies.FirstOrDefault(x => x.CompanyId == request.CompanyId) is null)
    {
        return Results.NotFound($"Не найдена компания {request.CompanyId}");
    }

    if (!string.IsNullOrEmpty(request.FullName))
    {
        employee.FullName = request.FullName;
    }

    if (!string.IsNullOrEmpty(request.Position))
    {
        employee.Position = request.Position;
    }

    if (request.BirthDate.HasValue)
    {
        employee.BirthDate = request.BirthDate.Value;
    }
    return Results.Ok(employee);
})
.WithName("Update")
.WithOpenApi();

app.MapDelete("/Employees/{employeeId}", (Guid employeeId) =>
{
    var employee = Storage.Employees.FirstOrDefault(r => r.EmployeeId == employeeId);
    if (employee is null)
    {
        return Results.NotFound($"Не найден работник {employeeId}");
    }

    Storage.Employees.Remove(employee);
    return Results.Ok(employeeId);
})
.WithName("Delete")
.WithOpenApi();

app.Run();


public class EmployeeDal
{
    public Guid EmployeeId { get; set; }

    public DateTime? BirthDate { get; set; }

    public Guid CompanyId { get; set; }

    public string FullName { get; set; }

    public string Position { get; set; }
}

public class CompanyDal
{
    public Guid CompanyId { get; set; }

    public string Name { get; set; }

    public string FieldOfActivity { get; set; }

    public string Location { get; set; }
}

public class Storage
{
    private static Random rand = new Random();

    public static CompanyDal[] Companies { get; set; }

    public static List<EmployeeDal> Employees { get; set; }

    static Storage()
    {
        var client = new HttpClient();
        string reqUrl = $"http://worker-1:8080/Companies/";
        Companies = client.GetFromJsonAsync<CompanyDal[]>(reqUrl).Result;//для простоты блокируем

        Employees = new List<EmployeeDal>()
        {
            new EmployeeDal() { EmployeeId = Guid.NewGuid(), BirthDate = DateTime.Today.AddDays(-100), CompanyId = Companies[rand.Next(Companies.Length)].CompanyId, FullName = "Миронов Евгений Олегович", Position = "Ведущий разработчик" },
            new EmployeeDal() { EmployeeId = Guid.NewGuid(), BirthDate = DateTime.Today.AddDays(-150), CompanyId = Companies[rand.Next(Companies.Length)].CompanyId, FullName = "Сидоров Петр Иванович", Position = "Уборщик" }
        };
    }
}