using Microsoft.AspNetCore.Mvc;
using BibliotecaAPI.Data;
using BibliotecaAPI.Models;
using Microsoft.EntityFrameworkCore;

namespace BibliotecaAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class PrestamosController : ControllerBase
    {
        private readonly BibliotecaContext _context;

        public PrestamosController(BibliotecaContext context)
        {
            _context = context;
        }

        // Crear préstamo
        [HttpPost("crear")]
        public async Task<ActionResult<Prestamo>> CrearPrestamo(Prestamo prestamo)
        {
            // Verificar si el usuario tiene 3 o más préstamos no devueltos
            var prestamosActivos = await _context.Prestamos
                .Where(p => p.Id_Usuario == prestamo.Id_Usuario && !p.Devuelto)
                .CountAsync();

            if (prestamosActivos >= 3)
                return BadRequest("El usuario ya tiene 3 préstamos activos. Debe devolver al menos uno antes de realizar un nuevo préstamo.");

            var libro = await _context.Libros.FindAsync(prestamo.Id_Libro);
            if (libro == null || libro.Copias_Disponibles <= 0)
                return BadRequest("Libro no disponible.");

            libro.Copias_Disponibles--;
            prestamo.Fecha_Prestamo = DateTime.Now;
            prestamo.Devuelto = false;
            
            _context.Prestamos.Add(prestamo);
            await _context.SaveChangesAsync();

            return Ok(prestamo);
        }

        // Registrar devolución
        [HttpPut("devolver/{id}")]
        public async Task<IActionResult> RegistrarDevolucion(int id)
        {
            var prestamo = await _context.Prestamos
                //.Include(p => p.Libro) // propiedad de navegación
                .FirstOrDefaultAsync(p => p.Id_Prestamo == id);
            
            if (prestamo == null) return NotFound();

            if (prestamo.Devuelto)
                return BadRequest("Este préstamo ya fue devuelto.");

            prestamo.Devuelto = true;
            //prestamo.Libro.Copias_Disponibles++;
            await _context.SaveChangesAsync();

            return Ok("Devolución registrada con éxito.");
}


        // Consultar préstamos activos
        [HttpGet("activos")]
        public async Task<ActionResult<IEnumerable<Prestamo>>> GetActivos()
        {
            return await _context.Prestamos
                //.Include(p => p.Libro)  
                //.Include(p => p.Usuario)
                .Where(p => !p.Devuelto)
                .ToListAsync();
        }

        // Consultar préstamos vencidos (más de 10 días)
        [HttpGet("vencidos")]
        public async Task<ActionResult<IEnumerable<Prestamo>>> GetVencidos()
        {
            var hoy = DateTime.Now;
            return await _context.Prestamos
                //.Include(p => p.Libro)  
                //.Include(p => p.Usuario)
                .Where(p => !p.Devuelto && (hoy - p.Fecha_Prestamo).TotalDays > 10)
                .ToListAsync();
        }

        // Historial por usuario
        [HttpGet("historial/{usuarioId}")]
        public async Task<ActionResult<IEnumerable<Prestamo>>> GetHistorialUsuario(int usuarioId)
        {
            return await _context.Prestamos
                //.Include(p => p.Libro)  
                .Where(p => p.Id_Usuario == usuarioId)
                .ToListAsync();
        }
    }
}