using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<DrugstoreService>();

// Add Swagger services
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});

var app = builder.Build();

// Configure the HTTP request pipeline.

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});


app.MapGet("/", (DrugstoreService service) => service.GetAll());

app.MapGet("/drugstores/{id}", (DrugstoreService service, Guid id) =>
{
    var drugstore = service.Get(id);
    return drugstore is not null ? Results.Ok(drugstore) : Results.NotFound();
});

app.MapPost("/drugstores", (DrugstoreService service, Drugstore drugstore) =>
{
    service.Create(drugstore);
    return Results.Created($"/drugstores/{drugstore.Id}", drugstore);
});

app.MapPut("/drugstores/{id}", (DrugstoreService service, Drugstore updatedDrugstore, Guid id) =>
{
    var drugstore = service.Get(id);
    if (drugstore is null) return Results.NotFound();

    service.Update(updatedDrugstore);
    return Results.Ok(updatedDrugstore);
});

app.MapDelete("/drugstores/{id}", (DrugstoreService service, Guid id) =>
{
    service.Delete(id);
    return Results.Ok();
});

app.Run();

public record Drugstore(Guid Id, string Name, string Address);

public class DrugstoreService
{
    private readonly List<Drugstore> _drugstores = new();

    public List<Drugstore> GetAll() => _drugstores;

    public Drugstore? Get(Guid id) => _drugstores.FirstOrDefault(d => d.Id == id);

    public void Create(Drugstore newDrugstore) => _drugstores.Add(newDrugstore);

    public void Update(Drugstore updatedDrugstore)
    {
        var index = _drugstores.FindIndex(d => d.Id == updatedDrugstore.Id);
        if (index == -1) return;

        _drugstores[index] = updatedDrugstore;
    }

    public void Delete(Guid id)
    {
        var drugstore = Get(id);
        if (drugstore is null) return;

        _drugstores.Remove(drugstore);
    }
}