using Apollinare.Infrastructure.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace Apollinare.API.Controllers;

[ApiController]
[Route("api/[controller]")]
public class LookupController : ControllerBase
{
    private readonly AppollinareDbContext _context;

    public LookupController(AppollinareDbContext context)
    {
        _context = context;
    }

    [HttpGet("tipi-evento")]
    public async Task<IActionResult> GetTipiEvento()
    {
        var items = await _context.TipiEvento
            .Where(t => t.Attivo)
            .OrderBy(t => t.Descrizione)
            .Select(t => new { t.Id, t.Codice, t.Descrizione })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("tipi-pasto")]
    public async Task<IActionResult> GetTipiPasto()
    {
        var items = await _context.TipiPasto
            .Where(t => t.Attivo)
            .OrderBy(t => t.Descrizione)
            .Select(t => new { t.Id, t.Codice, t.Descrizione })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("tipi-ospite")]
    public async Task<IActionResult> GetTipiOspite()
    {
        var items = await _context.TipiOspite
            .Where(t => t.Attivo)
            .OrderBy(t => t.Descrizione)
            .Select(t => new { t.Id, t.Codice, t.Descrizione })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("tipi-risorsa")]
    public async Task<IActionResult> GetTipiRisorsa()
    {
        var items = await _context.TipiRisorsa
            .Where(t => t.Attivo)
            .OrderBy(t => t.Descrizione)
            .Select(t => new { t.Id, t.Codice, t.Descrizione })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("tipi-materiale")]
    public async Task<IActionResult> GetTipiMateriale()
    {
        var items = await _context.TipiMateriale
            .Where(t => t.Attivo)
            .OrderBy(t => t.Descrizione)
            .Select(t => new { t.Id, t.Codice, t.Descrizione })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("categorie")]
    public async Task<IActionResult> GetCategorie()
    {
        var items = await _context.CodiciCategoria
            .Where(c => c.Attivo)
            .OrderBy(c => c.Descrizione)
            .Select(c => new { c.Id, c.Codice, c.Descrizione, c.CoeffA, c.CoeffB, c.CoeffS })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("clienti")]
    public async Task<IActionResult> GetClienti()
    {
        var items = await _context.Clienti
            .Where(c => c.Attivo)
            .OrderBy(c => c.RagioneSociale)
            .Select(c => new { c.Id, c.RagioneSociale, c.Citta })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("location")]
    public async Task<IActionResult> GetLocation()
    {
        var items = await _context.Location
            .Where(l => l.Attivo)
            .OrderBy(l => l.Nome)
            .Select(l => new { l.Id, l.Nome, l.Citta })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("risorse")]
    public async Task<IActionResult> GetRisorse()
    {
        var items = await _context.Risorse
            .Where(r => r.Attivo)
            .Include(r => r.TipoRisorsa)
            .OrderBy(r => r.Cognome).ThenBy(r => r.Nome)
            .Select(r => new { r.Id, r.Nome, r.Cognome, Tipo = r.TipoRisorsa!.Descrizione })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("articoli")]
    public async Task<IActionResult> GetArticoli()
    {
        var items = await _context.Articoli
            .Where(a => a.Attivo)
            .Include(a => a.TipoMateriale)
            .OrderBy(a => a.Descrizione)
            .Select(a => new { a.Id, a.Codice, a.Descrizione, Tipo = a.TipoMateriale!.Descrizione })
            .ToListAsync();
        return Ok(items);
    }

    [HttpGet("configurazioni")]
    public async Task<IActionResult> GetConfigurazioni()
    {
        var items = await _context.Configurazioni
            .Select(c => new { c.Chiave, c.Valore, c.Descrizione })
            .ToListAsync();
        return Ok(items);
    }
}
