<?php
include_once 'config/database.php';

// Configurar zona horaria de Lima, Perú
date_default_timezone_set('America/Lima');

$database = new Database();
$conn = $database->getConnection();

// Asegurar sesión iniciada
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Obtener la empresa del usuario logueado
$codempresaUsuario = null;
try {
    $stmt = $conn->prepare("SELECT codempresa FROM templeado WHERE codempleado = ?");
    $stmt->execute([$_SESSION['user']['codempleado']]);
    $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($resultado) {
        $codempresaUsuario = $resultado['codempresa'];
    }
} catch(PDOException $e) {
    die("Error al obtener la empresa del usuario");
}

// Obtener filtros
$codempleadoFiltro = isset($_GET['codempleado']) ? (int)$_GET['codempleado'] : null;
$mes = isset($_GET['mes']) ? (int)$_GET['mes'] : date('n');
$anio = isset($_GET['anio']) ? (int)$_GET['anio'] : date('Y');

// Validar mes y año
if ($mes < 1 || $mes > 12) $mes = date('n');
if ($anio < 2000 || $anio > 2100) $anio = date('Y');

if (!$codempleadoFiltro) {
    die("Error: No se ha seleccionado un empleado");
}

// Obtener información del empleado
$empleado = null;
try {
    $stmt = $conn->prepare("SELECT nombres, apellidoPaterno, apellidoMaterno FROM templeado WHERE codempleado = ?");
    $stmt->execute([$codempleadoFiltro]);
    $empleado = $stmt->fetch(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die("Error al obtener información del empleado");
}

// Obtener asistencias del mes seleccionado
$asistencias = [];
try {
    $fechaInicio = sprintf('%04d-%02d-01', $anio, $mes);
    $fechaFin = date('Y-m-t', strtotime($fechaInicio));
    
    $query = "SELECT 
                t.codprgturnos,
                t.codempleado,
                DATE(t.fecha) as fecha,
                t.reg_entrada,
                t.reg_salida,
                t.lat_entrada,
                t.lng_entrada,
                t.lat_salida,
                t.lng_salida,
                t.foto_entrada,
                t.foto_salidad,
                h.hora_entrada,
                h.hora_salida,
                h.minutos_tolerancia,
                h.denominacion as horario_denominacion,
                h.sigla as horario_sigla,
                e.nombres,
                e.apellidoPaterno,
                e.apellidoMaterno
              FROM tprogturnos t
              INNER JOIN thorario_per h ON t.codhorario_per = h.codhorario_per
              INNER JOIN templeado e ON t.codempleado = e.codempleado
              WHERE t.codempleado = ?
                AND DATE(t.fecha) >= ?
                AND DATE(t.fecha) <= ?
              ORDER BY t.fecha ASC";
    
    $stmt = $conn->prepare($query);
    $stmt->execute([$codempleadoFiltro, $fechaInicio, $fechaFin]);
    $asistencias = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Calcular tardanzas y anticipos (igual que en reportes_asistencias.php)
    foreach ($asistencias as &$asistencia) {
        // Calcular tardanza en entrada (considerando minutos de tolerancia)
        if (!empty($asistencia['reg_entrada']) && !empty($asistencia['hora_entrada'])) {
            $fechaEntrada = new DateTime($asistencia['reg_entrada']);
            $fechaBase = new DateTime($asistencia['fecha']);
            $horaEntradaEsperada = new DateTime($fechaBase->format('Y-m-d') . ' ' . $asistencia['hora_entrada']);
            
            // Obtener minutos de tolerancia del horario
            $minutosTolerancia = 0;
            if (!empty($asistencia['minutos_tolerancia'])) {
                $timeParts = explode(':', $asistencia['minutos_tolerancia']);
                if (count($timeParts) >= 2) {
                    $minutosTolerancia = intval($timeParts[1]);
                }
            }
            
            // Sumar minutos de tolerancia a la hora de entrada esperada
            if ($minutosTolerancia > 0) {
                $horaEntradaEsperada->modify('+' . $minutosTolerancia . ' minutes');
            }
            
            if ($fechaEntrada > $horaEntradaEsperada) {
                $diff = $fechaEntrada->diff($horaEntradaEsperada);
                $asistencia['tardanza_minutos'] = ($diff->days * 24 * 60) + ($diff->h * 60) + $diff->i;
                $asistencia['tipo_entrada'] = 'tardanza';
            } else {
                $asistencia['tardanza_minutos'] = 0;
                $asistencia['tipo_entrada'] = 'puntual';
            }
        } else {
            $asistencia['tardanza_minutos'] = null;
            $asistencia['tipo_entrada'] = empty($asistencia['reg_entrada']) ? 'falta' : 'sin_horario';
        }
        
        // Calcular anticipo o retraso en salida
        if (!empty($asistencia['reg_salida']) && !empty($asistencia['hora_salida'])) {
            $fechaSalida = new DateTime($asistencia['reg_salida']);
            $fechaBase = new DateTime($asistencia['fecha']);
            $horaSalidaEsperada = new DateTime($fechaBase->format('Y-m-d') . ' ' . $asistencia['hora_salida']);
            
            if ($fechaSalida < $horaSalidaEsperada) {
                $diff = $horaSalidaEsperada->diff($fechaSalida);
                $asistencia['anticipo_minutos'] = ($diff->days * 24 * 60) + ($diff->h * 60) + $diff->i;
                $asistencia['retraso_minutos'] = null;
                $asistencia['tipo_salida'] = 'anticipo';
            } else {
                $diff = $fechaSalida->diff($horaSalidaEsperada);
                $asistencia['anticipo_minutos'] = null;
                $asistencia['retraso_minutos'] = ($diff->days * 24 * 60) + ($diff->h * 60) + $diff->i;
                $asistencia['tipo_salida'] = 'retraso';
            }
        } else {
            $asistencia['anticipo_minutos'] = null;
            $asistencia['retraso_minutos'] = null;
            $asistencia['tipo_salida'] = empty($asistencia['reg_salida']) ? 'sin_registro' : 'sin_horario';
        }
    }
    unset($asistencia);
} catch(PDOException $e) {
    die("Error al obtener las asistencias: " . $e->getMessage());
}

// Nombres de los meses
$meses = [
    1 => 'Enero', 2 => 'Febrero', 3 => 'Marzo', 4 => 'Abril',
    5 => 'Mayo', 6 => 'Junio', 7 => 'Julio', 8 => 'Agosto',
    9 => 'Septiembre', 10 => 'Octubre', 11 => 'Noviembre', 12 => 'Diciembre'
];

// Nombre del archivo
$nombreEmpleado = $empleado ? 
    preg_replace('/[^a-zA-Z0-9_-]/', '_', $empleado['apellidoPaterno'] . '_' . $empleado['apellidoMaterno'] . '_' . $empleado['nombres']) : 
    'empleado';
$filename = 'Reporte_Asistencias_' . $nombreEmpleado . '_' . $meses[$mes] . '_' . $anio . '_' . date('Ymd_His') . '.xls';

// Headers para Excel
header('Content-Type: application/vnd.ms-excel; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Pragma: no-cache');
header('Expires: 0');
header('Cache-Control: no-cache, must-revalidate');

// BOM para UTF-8
echo "\xEF\xBB\xBF";

// Crear el archivo Excel usando HTML table
echo '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">';
echo '<head>';
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
echo '<!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Reporte Asistencias</x:Name><x:WorksheetOptions><x:DefaultRowHeight>285</x:DefaultRowHeight></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';
echo '<style>';
echo 'td { font-size: 11px; }';
echo 'th { font-size: 11px; font-weight: bold; }';
echo '</style>';
echo '</head>';
echo '<body>';

// Título principal
echo '<table border="0" cellpadding="5" cellspacing="0" style="width: 100%; margin-bottom: 20px;">';
echo '<tr>';
echo '<td colspan="11" style="text-align: center; background-color: #667eea; color: white; font-size: 18px; font-weight: bold; padding: 15px;">';
echo '<h2 style="margin: 0; color: white;">REPORTE DE ASISTENCIAS</h2>';
echo '</td>';
echo '</tr>';
echo '</table>';

// Información del empleado y período
echo '<table border="1" cellpadding="5" cellspacing="0" style="margin-bottom: 20px; width: 100%;">';
echo '<tr style="background-color: #f8f9fa; font-weight: bold;">';
echo '<td colspan="11" style="background-color: #667eea; color: white; font-size: 14px; text-align: center;">INFORMACIÓN DEL REPORTE</td>';
echo '</tr>';
echo '<tr>';
echo '<td style="font-weight: bold; width: 15%; background-color: #e9ecef;">Trabajador:</td>';
echo '<td style="width: 35%;">' . htmlspecialchars($empleado['apellidoPaterno'] . ' ' . $empleado['apellidoMaterno'] . ', ' . $empleado['nombres']) . '</td>';
echo '<td style="font-weight: bold; width: 15%; background-color: #e9ecef;">Período:</td>';
echo '<td style="width: 35%;">' . htmlspecialchars($meses[$mes] . ' ' . $anio) . '</td>';
echo '</tr>';
echo '<tr>';
echo '<td style="font-weight: bold; background-color: #e9ecef;">Fecha de Generación:</td>';
echo '<td>' . date('d/m/Y H:i:s') . '</td>';
echo '<td style="font-weight: bold; background-color: #e9ecef;">Total Registros:</td>';
echo '<td>' . count($asistencias) . '</td>';
echo '</tr>';
echo '</table>';

// Tabla de asistencias
echo '<table border="1" cellpadding="5" cellspacing="0" style="width: 100%; border-collapse: collapse;">';

// Encabezados
echo '<tr style="background-color: #4CAF50; color: white; font-weight: bold; text-align: center; height: 40px;">';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 8%;">Fecha</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 10%;">Horario</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 8%;">Hora Entrada<br>Programada</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 10%;">Registro<br>Entrada</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 10%;">Estado<br>Entrada</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 8%;">Hora Salida<br>Programada</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 10%;">Registro<br>Salida</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 10%;">Estado<br>Salida</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 8%;">Coordenadas<br>Entrada</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 9%;">Coordenadas<br>Salida</th>';
echo '<th style="border: 2px solid #2d7a3d; padding: 10px; width: 9%;">Observaciones</th>';
echo '</tr>';

// Función para obtener color de fondo según estado
function getColorEstado($tipo) {
    switch($tipo) {
        case 'puntual':
            return '#d4edda'; // Verde claro
        case 'tardanza':
            return '#fff3cd'; // Amarillo claro
        case 'falta':
            return '#f8d7da'; // Rojo claro
        case 'anticipo':
            return '#d1ecf1'; // Azul claro
        case 'retraso':
            return '#ffeaa7'; // Amarillo más intenso
        case 'sin_registro':
        case 'sin_horario':
            return '#e2e3e5'; // Gris claro
        default:
            return '#ffffff'; // Blanco
    }
}

// Función para obtener color de texto según estado
function getColorTexto($tipo) {
    switch($tipo) {
        case 'puntual':
            return '#155724'; // Verde oscuro
        case 'tardanza':
            return '#856404'; // Amarillo oscuro
        case 'falta':
            return '#721c24'; // Rojo oscuro
        case 'anticipo':
            return '#0c5460'; // Azul oscuro
        case 'retraso':
            return '#856404'; // Amarillo oscuro
        case 'sin_registro':
        case 'sin_horario':
            return '#383d41'; // Gris oscuro
        default:
            return '#000000'; // Negro
    }
}

// Datos
foreach ($asistencias as $asist) {
    $fecha = date('d/m/Y', strtotime($asist['fecha']));
    $horaEntradaProg = !empty($asist['hora_entrada']) ? date('H:i', strtotime($asist['hora_entrada'])) : '-';
    $horaSalidaProg = !empty($asist['hora_salida']) ? date('H:i', strtotime($asist['hora_salida'])) : '-';
    $regEntrada = !empty($asist['reg_entrada']) ? date('d/m/Y H:i:s', strtotime($asist['reg_entrada'])) : '-';
    $regSalida = !empty($asist['reg_salida']) ? date('d/m/Y H:i:s', strtotime($asist['reg_salida'])) : '-';
    
    // Texto de estado entrada
    $textoEntrada = '';
    $tipoEntrada = $asist['tipo_entrada'] ?? 'sin-registro';
    if ($tipoEntrada == 'tardanza') {
        $textoEntrada = 'Tardanza: ' . ($asist['tardanza_minutos'] ?? 0) . ' min';
    } elseif ($tipoEntrada == 'falta') {
        $textoEntrada = 'FALTA';
    } elseif ($tipoEntrada == 'puntual') {
        $textoEntrada = 'Puntual';
    } else {
        $textoEntrada = '-';
    }
    
    // Texto de estado salida
    $textoSalida = '';
    $tipoSalida = $asist['tipo_salida'] ?? 'sin-registro';
    if ($tipoSalida == 'anticipo') {
        $textoSalida = 'Anticipo: ' . ($asist['anticipo_minutos'] ?? 0) . ' min';
    } elseif ($tipoSalida == 'retraso') {
        $textoSalida = 'Retraso: ' . ($asist['retraso_minutos'] ?? 0) . ' min';
    } elseif ($tipoSalida == 'sin_registro') {
        $textoSalida = 'Sin registro';
    } else {
        $textoSalida = '-';
    }
    
    // Coordenadas
    $coordEntrada = (!empty($asist['lat_entrada']) && !empty($asist['lng_entrada'])) ? 
        $asist['lat_entrada'] . ', ' . $asist['lng_entrada'] : '-';
    $coordSalida = (!empty($asist['lat_salida']) && !empty($asist['lng_salida'])) ? 
        $asist['lat_salida'] . ', ' . $asist['lng_salida'] : '-';
    
    // Observaciones
    $observaciones = '';
    if ($tipoEntrada == 'falta') {
        $observaciones = 'Falta de asistencia';
    } elseif ($tipoEntrada == 'tardanza' && $asist['tardanza_minutos'] > 30) {
        $observaciones = 'Tardanza significativa';
    } elseif ($tipoSalida == 'anticipo' && $asist['anticipo_minutos'] > 30) {
        $observaciones = 'Salida anticipada significativa';
    }
    
    echo '<tr>';
    
    // Fecha
    echo '<td style="text-align: center; font-weight: bold; border: 1px solid #ddd; padding: 8px;">' . htmlspecialchars($fecha) . '</td>';
    
    // Horario
    $horarioTexto = '';
    if (!empty($asist['horario_sigla'])) {
        $horarioTexto = htmlspecialchars($asist['horario_sigla']);
    }
    if (!empty($asist['horario_denominacion'])) {
        $horarioTexto .= ($horarioTexto ? ' - ' : '') . htmlspecialchars($asist['horario_denominacion']);
    }
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px;">' . ($horarioTexto ?: '-') . '</td>';
    
    // Hora Entrada Programada
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px;">' . htmlspecialchars($horaEntradaProg) . '</td>';
    
    // Registro Entrada
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px;">' . htmlspecialchars($regEntrada) . '</td>';
    
    // Estado Entrada (con color)
    $colorFondoEntrada = getColorEstado($tipoEntrada);
    $colorTextoEntrada = getColorTexto($tipoEntrada);
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px; background-color: ' . $colorFondoEntrada . '; color: ' . $colorTextoEntrada . '; font-weight: bold;">' . htmlspecialchars($textoEntrada) . '</td>';
    
    // Hora Salida Programada
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px;">' . htmlspecialchars($horaSalidaProg) . '</td>';
    
    // Registro Salida
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px;">' . htmlspecialchars($regSalida) . '</td>';
    
    // Estado Salida (con color)
    $colorFondoSalida = getColorEstado($tipoSalida);
    $colorTextoSalida = getColorTexto($tipoSalida);
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px; background-color: ' . $colorFondoSalida . '; color: ' . $colorTextoSalida . '; font-weight: bold;">' . htmlspecialchars($textoSalida) . '</td>';
    
    // Coordenadas Entrada
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px; font-size: 9px;">' . htmlspecialchars($coordEntrada) . '</td>';
    
    // Coordenadas Salida
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px; font-size: 9px;">' . htmlspecialchars($coordSalida) . '</td>';
    
    // Observaciones
    echo '<td style="text-align: center; border: 1px solid #ddd; padding: 8px; font-size: 10px; font-style: italic;">' . htmlspecialchars($observaciones) . '</td>';
    
    echo '</tr>';
}

echo '</table>';


// Resumen estadístico
$totalPuntual = 0;
$totalTardanza = 0;
$totalFalta = 0;
$totalAnticipo = 0;
$totalRetraso = 0;
$totalSinRegistro = 0;

foreach ($asistencias as $asist) {
    if (($asist['tipo_entrada'] ?? '') == 'puntual') $totalPuntual++;
    if (($asist['tipo_entrada'] ?? '') == 'tardanza') $totalTardanza++;
    if (($asist['tipo_entrada'] ?? '') == 'falta') $totalFalta++;
    if (($asist['tipo_salida'] ?? '') == 'anticipo') $totalAnticipo++;
    if (($asist['tipo_salida'] ?? '') == 'retraso') $totalRetraso++;
    if (($asist['tipo_entrada'] ?? '') == 'sin_registro' || ($asist['tipo_salida'] ?? '') == 'sin_registro') $totalSinRegistro++;
}

echo '<table border="0" cellpadding="10" cellspacing="0" style="width: 100%; margin-top: 20px;">';
echo '<tr>';
echo '<td colspan="11" style="background-color: #f8f9fa; border: 2px solid #667eea; padding: 15px;">';
echo '<h3 style="margin: 0 0 15px 0; color: #667eea;">RESUMEN ESTADÍSTICO</h3>';
echo '<table border="1" cellpadding="8" cellspacing="0" style="width: 100%;">';
echo '<tr style="background-color: #667eea; color: white; font-weight: bold;">';
echo '<td style="text-align: center; padding: 10px;">Puntual</td>';
echo '<td style="text-align: center; padding: 10px;">Tardanzas</td>';
echo '<td style="text-align: center; padding: 10px;">Faltas</td>';
echo '<td style="text-align: center; padding: 10px;">Anticipos</td>';
echo '<td style="text-align: center; padding: 10px;">Retrasos</td>';
echo '<td style="text-align: center; padding: 10px;">Sin Registro</td>';
echo '<td style="text-align: center; padding: 10px;">Total Días</td>';
echo '</tr>';
echo '<tr>';
echo '<td style="text-align: center; background-color: #d4edda; color: #155724; font-weight: bold; padding: 10px;">' . $totalPuntual . '</td>';
echo '<td style="text-align: center; background-color: #fff3cd; color: #856404; font-weight: bold; padding: 10px;">' . $totalTardanza . '</td>';
echo '<td style="text-align: center; background-color: #f8d7da; color: #721c24; font-weight: bold; padding: 10px;">' . $totalFalta . '</td>';
echo '<td style="text-align: center; background-color: #d1ecf1; color: #0c5460; font-weight: bold; padding: 10px;">' . $totalAnticipo . '</td>';
echo '<td style="text-align: center; background-color: #ffeaa7; color: #856404; font-weight: bold; padding: 10px;">' . $totalRetraso . '</td>';
echo '<td style="text-align: center; background-color: #e2e3e5; color: #383d41; font-weight: bold; padding: 10px;">' . $totalSinRegistro . '</td>';
echo '<td style="text-align: center; background-color: #667eea; color: white; font-weight: bold; padding: 10px; font-size: 14px;">' . count($asistencias) . '</td>';
echo '</tr>';
echo '</table>';
echo '</td>';
echo '</tr>';
echo '</table>';

echo '</body>';
echo '</html>';
?>

