using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using foundation_system.Data;
using foundation_system.Models;

namespace foundation_system.Controllers;

[Authorize]
public class ColaboradorAsistenciaController : Controller
{
    private readonly ApplicationDbContext _context;

    public ColaboradorAsistenciaController(ApplicationDbContext context)
    {
        _context = context;
    }

    // GET: ColaboradorAsistencia
    public async Task<IActionResult> Index(DateOnly? fecha)
    {
        var selectedDate = fecha ?? DateOnly.FromDateTime(DateTime.Today);
        if (fecha.HasValue)
        {
            TempData["InfoMessage"] = $"Mostrando asistencia del {selectedDate:dd/MM/yyyy}";
        }
        ViewBag.SelectedDate = selectedDate;

        var colaboradores = await _context.Colaboradores
            .Include(c => c.Persona)
            .Include(c => c.Cargo)
            .Where(c => c.Activo)
            .OrderBy(c => c.Persona.Apellidos)
            .ToListAsync();

        var asistencias = await _context.AsistenciasColaboradores
            .Where(a => a.Fecha == selectedDate)
            .ToDictionaryAsync(a => a.ColaboradorId);

        ViewBag.Asistencias = asistencias;

        return View(colaboradores);
    }

    // POST: ColaboradorAsistencia/Save
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Save(long colaboradorId, DateOnly fecha, string estado, string? observaciones)
    {
        var asistencia = await _context.AsistenciasColaboradores
            .FirstOrDefaultAsync(a => a.ColaboradorId == colaboradorId && a.Fecha == fecha);

        if (asistencia == null)
        {
            asistencia = new AsistenciaColaborador
            {
                ColaboradorId = colaboradorId,
                Fecha = fecha,
                Estado = estado,
                Observaciones = observaciones,
                CreadoEn = DateTime.UtcNow
            };
            _context.AsistenciasColaboradores.Add(asistencia);
        }
        else
        {
            asistencia.Estado = estado;
            asistencia.Observaciones = observaciones;
        }

    await _context.SaveChangesAsync();
        return Json(new { success = true });
    }

    // GET: ColaboradorAsistencia/ImprimirAsistencia
    public async Task<IActionResult> ImprimirAsistencia(DateOnly? fecha)
    {
        var selectedDate = fecha ?? DateOnly.FromDateTime(DateTime.Today);
        ViewBag.SelectedDate = selectedDate;

        var colaboradores = await _context.Colaboradores
            .Include(c => c.Persona)
            .Include(c => c.Cargo)
            .Where(c => c.Activo)
            .OrderBy(c => c.Persona.Apellidos)
            .ToListAsync();

        var asistencias = await _context.AsistenciasColaboradores
            .Where(a => a.Fecha == selectedDate)
            .ToDictionaryAsync(a => a.ColaboradorId);

        ViewBag.Asistencias = asistencias;

        return View(colaboradores);
    }

    // GET: ColaboradorAsistencia/ReporteAsistencia
    public async Task<IActionResult> ReporteAsistencia(long? colaboradorId, DateOnly? inicio, DateOnly? fin)
    {
        var startDate = inicio ?? DateOnly.FromDateTime(DateTime.Today.AddDays(-30));
        var endDate = fin ?? DateOnly.FromDateTime(DateTime.Today);

        ViewBag.Inicio = startDate;
        ViewBag.Fin = endDate;
        ViewBag.ColaboradorId = colaboradorId;

        ViewBag.Colaboradores = await _context.Colaboradores
            .Include(c => c.Persona)
            .Include(c => c.Cargo)
            .Where(c => c.Activo)
            .OrderBy(c => c.Persona.Apellidos)
            .ToListAsync();

        if (colaboradorId.HasValue)
        {
            var asistencias = await _context.AsistenciasColaboradores
                .Include(a => a.Colaborador)
                .ThenInclude(c => c.Persona)
                .Where(a => a.ColaboradorId == colaboradorId && a.Fecha >= startDate && a.Fecha <= endDate)
                .OrderByDescending(a => a.Fecha)
                .ToListAsync();

            return View(asistencias);
        }

        return View(new List<AsistenciaColaborador>());
    }

    // GET: ColaboradorAsistencia/SearchColaboradores
    [HttpGet]
    public async Task<IActionResult> SearchColaboradores(string term)
    {
        if (string.IsNullOrWhiteSpace(term) || term.Length < 2)
        {
            return Json(new List<object>());
        }

        var results = await _context.Database
            .SqlQueryRaw<SearchResult>(
                "SELECT id, text, score FROM buscar_personas_v2(@p0, 'COLABORADOR')", 
                term)
            .ToListAsync();

        return Json(results);
    }
}

public class SearchResult
{
    public long Id { get; set; }
    public string Text { get; set; } = string.Empty;
    public double Score { get; set; }
}
