<?php
// vista/reportes/reporte_operarios.php
$db = new clsbdd();

$fecha_inicio = $_GET['fecha_inicio'] ?? date('Y-m-01');
$fecha_fin    = $_GET['fecha_fin'] ?? date('Y-m-d');

/**
 * CONSULTA CORREGIDA Y OPTIMIZADA:
 * Se aplican LEFT JOINs tanto a la tabla de servicios (cs) como a la de productos (p).
 * Usamos un IF() en el SELECT para mostrar el nombre real del ítem dependiendo de si es 'Producto' o 'Servicio'.
 * Se añade d.det_id al ORDER BY final para evitar desórdenes visuales al refrescar.
 */
$sql = "SELECT 
            ope.ope_id,
            ope.ope_nombre, 
            o.ord_id,
            v.veh_tipo, 
            d.det_tipoitem,
            d.det_preciounitario as precio_venta_sistema,
            COUNT(d.ord_id) as cantidad_realizada,
            -- Muestra el nombre del producto si el tipo es Producto, de lo contrario muestra el servicio
            IF(d.det_tipoitem = 'Producto', p.pro_nombre, cs.ser_nombre) as nombre_item_real,
            -- Subconsulta 1: Cuenta si en esta orden se vendieron productos de aceite/filtros
            (
                SELECT COUNT(*) 
                FROM car_ordendetalles d2
                LEFT JOIN car_invproductos p2 ON d2.det_itemid = p2.pro_id AND d2.det_tipoitem = 'Producto'
                WHERE d2.ord_id = o.ord_id 
                AND d2.det_tipoitem = 'Producto'
                AND (LOWER(p2.pro_nombre) LIKE '%aceite%' OR LOWER(p2.pro_nombre) LIKE '%filtro%')
            ) as tiene_productos_aceite,
            -- Subconsulta 2: Cuenta si existe el servicio de cambio de aceite en la orden
            (
                SELECT COUNT(*) 
                FROM car_ordendetalles d3
                INNER JOIN car_catservicios cs3 ON d3.det_itemid = cs3.ser_id AND d3.det_tipoitem = 'Servicio'
                WHERE d3.ord_id = o.ord_id 
                AND d3.det_tipoitem = 'Servicio'
                AND LOWER(cs3.ser_nombre) LIKE '%cambio%aceite%'
            ) as tiene_servicio_aceite
        FROM car_operarios ope
        INNER JOIN car_ordendetalles d ON ope.ope_id = d.ope_id
        INNER JOIN car_ordenestrabajo o ON d.ord_id = o.ord_id
        INNER JOIN car_clientesvehiculos v ON o.veh_id = v.veh_id
        -- Unimos ambas tablas para extraer el nombre correcto del concepto cobrado
        LEFT JOIN car_catservicios cs ON d.det_itemid = cs.ser_id AND d.det_tipoitem = 'Servicio'
        LEFT JOIN car_invproductos p ON d.det_itemid = p.pro_id AND d.det_tipoitem = 'Producto'
        WHERE o.ord_fecha BETWEEN '$fecha_inicio' AND '$fecha_fin'
        AND o.ord_estado != 'Anulado'
        GROUP BY ope.ope_id, ope.ope_nombre, o.ord_id, v.veh_tipo, d.det_tipoitem, d.det_preciounitario, nombre_item_real, tiene_productos_aceite, tiene_servicio_aceite
        ORDER BY ope.ope_nombre ASC, o.ord_id DESC, d.det_id ASC";

$resultado = $db->ejecutar($sql);
?>

<div class="container-fluid py-4">
    <div class="d-flex justify-content-between align-items-center mb-4">
        <h4 class="fw-bold text-dark"><i class="fas fa-file-invoice-dollar me-2 text-primary"></i>Reporte de Liquidación de Operarios</h4>
        <button onclick="window.print();" class="btn btn-outline-secondary shadow-sm d-print-none">
            <i class="fas fa-print me-1"></i> Imprimir Reporte
        </button>
    </div>

    <div class="card shadow-sm border-0 mb-4 d-print-none">
        <div class="card-body bg-light rounded">
            <form method="GET" action="index.php" class="row g-3 align-items-end">
                <input type="hidden" name="page" value="reportes/reporte_operarios">
                <div class="col-md-5">
                    <label class="small fw-bold text-muted text-uppercase">Fecha Inicio</label>
                    <input type="date" name="fecha_inicio" class="form-control" value="<?= $fecha_inicio ?>">
                </div>
                <div class="col-md-5">
                    <label class="small fw-bold text-muted text-uppercase">Fecha Fin</label>
                    <input type="date" name="fecha_fin" class="form-control" value="<?= $fecha_fin ?>">
                </div>
                <div class="col-md-2">
                    <button type="submit" class="btn btn-primary w-100 shadow-sm"><i class="fas fa-filter me-1"></i> Filtrar</button>
                </div>
            </form>
        </div>
    </div>

    <div class="card shadow-sm border-0">
        <div class="table-responsive">
            <table class="table table-hover align-middle mb-0" id="tabla-operarios">
                <thead class="table-dark">
                    <tr>
                        <th class="ps-4" style="width: 110px;">N° Orden</th>
                        <th>Tipo de Vehículo</th>
                        <th>Servicio / Producto Realizado</th>
                        <th class="text-center d-print-none">Precio Venta (Ref)</th>
                        <th class="text-center" style="width: 140px;">Precio Operario ($)</th>
                        <th class="text-center text-warning">Cantidad</th>
                        <th class="text-end pe-4 text-success">Total a Pagar</th>
                    </tr>
                </thead>
                <tbody>
                    <?php 
                    if($resultado && $resultado->num_rows > 0): 
                        $current_operario = "";
                        $current_id = "";
                        $primer_registro  = true;
                        $index_fila = 0;

                        while($row = $resultado->fetch_assoc()): 
                            $nombre_item     = mb_strtolower($row['nombre_item_real'], 'UTF-8');
                            $tipo_vehiculo   = $row['veh_tipo'];
                            $tipo_item       = $row['det_tipoitem'];
                            $precio_sistema  = (float)$row['precio_venta_sistema'];
                            
                            // Estados cruzados de la orden completa
                            $tiene_productos = (int)$row['tiene_productos_aceite'] > 0;
                            $tiene_serv_aceite = (int)$row['tiene_servicio_aceite'] > 0;
                            
                            // Si la orden contiene tanto productos (aceite/filtro) como el servicio de cambio
                            $es_combo_promocional = ($tiene_productos && $tiene_serv_aceite);

                            $pago_unitario   = 0.00;
                            $etiqueta_especial = "";
                            $es_producto     = ($tipo_item === 'Producto');

                            // 1. REGLA: Si es Producto Físico de Inventario -> Operario recibe $0.00
                            if ($es_producto) {
                                $pago_unitario = 0.00;
                                $etiqueta_especial = '<span class="badge bg-secondary text-white ms-2 d-print-none"><i class="fas fa-box"></i> Producto</span>';
                            } 
                            // 2. REGLA PRIORITARIA DE MANO DE OBRA: Si explícitamente es mano de obra de aceite, paga siempre $1.50 (Evita el error de la orden 1173)
                            elseif (strpos($nombre_item, 'mano de obra') !== false && strpos($nombre_item, 'aceite') !== false) {
                                $pago_unitario = 1.50;
                                $etiqueta_especial = '<span class="badge bg-dark text-white ms-2 d-print-none">Solo Mano de Obra</span>';
                            }
                            // 3. REGLA: Combo de cambio de aceite promocional (Caso Orden 907)
                            elseif ($es_combo_promocional) {
                                if (strpos($nombre_item, 'cambio') !== false && strpos($nombre_item, 'aceite') !== false) {
                                    $pago_unitario = 3.00; // Absorbe los $3.00 por el servicio completo de la promoción
                                    $etiqueta_especial = '<span class="badge bg-success text-white ms-2 d-print-none"><i class="fas fa-oil-can"></i> Pago Trabajo Aceite</span>';
                                } elseif (strpos($nombre_item, 'express') !== false || strpos($nombre_item, 'expres') !== false) {
                                    $pago_unitario = 0.00; // El lavado express va en $0.00 para no duplicar el pago
                                    $etiqueta_especial = '<span class="badge bg-info text-dark ms-2 d-print-none"><i class="fas fa-gift"></i> Lavado en Combo</span>';
                                } else {
                                    $pago_unitario = 1.00;
                                }
                            } 
                            // 4. REGLA: Servicios sueltos sin productos en la orden
                            else {
                                if (strpos($nombre_item, 'aceite') !== false) {
                                    $pago_unitario = 3.00; 
                                } elseif (strpos($nombre_item, 'chasis') !== false || strpos($nombre_item, 'debajo') !== false) {
                                    $pago_unitario = 1.00;
                                } elseif (strpos($nombre_item, 'taxi') !== false) {
                                    $pago_unitario = 1.25;
                                } elseif (strpos($nombre_item, 'moto') !== false || $tipo_vehiculo == 'Moto') {
                                    $pago_unitario = 1.00;
                                } elseif (strpos($nombre_item, 'flas') !== false || strpos($nombre_item, 'flash') !== false) {
                                    $pago_unitario = ($precio_sistema >= 3.00) ? 1.00 : 0.50;
                                } elseif (strpos($nombre_item, 'express') !== false || strpos($nombre_item, 'expres') !== false) {
                                    $pago_unitario = ($tipo_vehiculo == 'Camioneta' || $tipo_vehiculo == 'SUV' || $tipo_vehiculo == 'Camión' || $tipo_vehiculo == 'Grande' || $tipo_vehiculo == 'Suv') ? 1.75 : 1.50;
                                } elseif (strpos($nombre_item, 'completa') !== false || strpos($nombre_item, 'completo') !== false) {
                                    $pago_unitario = ($tipo_vehiculo == 'Camioneta' || $tipo_vehiculo == 'SUV' || $tipo_vehiculo == 'Camión' || $tipo_vehiculo == 'Grande' || $tipo_vehiculo == 'Suv') ? 3.00 : 2.50;
                                } else {
                                    $pago_unitario = 1.00;
                                }
                            }

                            $cantidad = (int)$row['cantidad_realizada'];
                            $total_fila = $pago_unitario * $cantidad;

                            if($current_operario != $row['ope_nombre']):
                                if(!$primer_registro): 
                    ?>
                                    <tr class="table-light fw-bold border-bottom border-secondary subtotal-row" data-operario-id="<?= $current_id ?>">
                                        <td></td>
                                        <td class="d-print-none"></td>
                                        <td colspan="2" class="text-end text-dark text-uppercase pe-3">Subtotal <?= htmlspecialchars($current_operario) ?>:</td>
                                        <td class="text-center text-dark bg-warning bg-opacity-10 total-cantidad">0</td>
                                        <td class="text-end pe-4 text-success bg-success bg-opacity-10 total-dinero">$0.00</td>
                                    </tr>
                    <?php 
                                endif;
                                
                                $current_operario = $row['ope_nombre'];
                                $current_id       = $row['ope_id'];
                                $primer_registro  = false;
                    ?>
                                <tr class="table-secondary">
                                    <td colspan="7" class="ps-4 fw-bold text-dark text-uppercase">
                                        <i class="fas fa-user me-2"></i><?= htmlspecialchars($current_operario) ?>
                                    </td>
                                </tr>
                    <?php 
                            endif; 
                            $unique_row_id = "ope_" . $current_id . "_ord_" . $row['ord_id'] . "_" . md5($row['nombre_item_real']);
                    ?>
                            <tr class="item-row" data-operario-id="<?= $current_id ?>" data-row-key="<?= $unique_row_id ?>">
                                <td class="ps-4 font-monospace fw-bold text-secondary">#<?= str_pad($row['ord_id'], 5, "0", STR_PAD_LEFT) ?></td> 
                                <td class="text-muted"><i class="fas <?= $es_producto ? 'fa-box' : 'fa-car' ?> me-2"></i><?= htmlspecialchars($tipo_vehiculo ?: 'N/A') ?></td>
                                <td class="fw-semibold text-dark">
                                    <?= htmlspecialchars($row['nombre_item_real']) ?>
                                    <?= $etiqueta_especial ?>
                                </td>
                                <td class="text-center text-muted small d-print-none">$<?= number_format($precio_sistema, 2) ?></td>
                                
                                <td class="text-center d-flex justify-content-center align-items-center">
                                    <div class="input-group input-group-sm" style="max-width: 100px;">
                                        <span class="input-group-text p-1 bg-white border-end-0 d-print-none">$</span>
                                        <input type="number" 
                                               step="0.05" 
                                               min="0" 
                                               class="form-control text-center fw-bold p-1 input-precio border-start-0 ps-0 <?= $pago_unitario == 0 ? 'text-muted bg-light' : '' ?>" 
                                               value="<?= number_format($pago_unitario, 2, '.', '') ?>" 
                                               data-default-val="<?= number_format($pago_unitario, 2, '.', '') ?>"
                                               data-cantidad="<?= $cantidad ?>"
                                               onchange="recalcularFila(this)" 
                                               onkeyup="recalcularFila(this)">
                                    </div>
                                </td>
                                
                                <td class="text-center fw-bold text-primary val-cantidad"><?= $cantidad ?></td>
                                <td class="text-end pe-4 fw-bold text-dark val-total" data-valor="<?= $total_fila ?>">$<?= number_format($total_fila, 2) ?></td>
                            </tr>
                    <?php 
                            $index_fila++;
                        endwhile; 
                    ?>
                        <tr class="table-light fw-bold border-bottom border-secondary subtotal-row" data-operario-id="<?= $current_id ?>">
                            <td></td>
                            <td class="d-print-none"></td>
                            <td colspan="2" class="text-end text-dark text-uppercase pe-3">Subtotal <?= htmlspecialchars($current_operario) ?>:</td>
                            <td class="text-center text-dark bg-warning bg-opacity-10 total-cantidad">0</td>
                            <td class="text-end pe-4 text-success bg-success bg-opacity-10 total-dinero">$0.00</td>
                        </tr>
                    <?php 
                    else: 
                    ?>
                        <tr>
                            <td colspan="7" class="text-center py-4 text-muted">No se encontraron registros en las fechas seleccionadas.</td>
                        </tr>
                    <?php 
                    endif; 
                    ?>
                </tbody>
            </table>
        </div>
    </div>
</div>

<script>
document.addEventListener("DOMContentLoaded", function() {
    cargarValoresPersonalizados();
    recalcularTodoElReporte();
});

function recalcularFila(input) {
    let precio = parseFloat(input.value);
    if (isNaN(precio) || precio < 0) precio = 0;

    let cantidad = parseInt(input.getAttribute('data-cantidad'));
    let totalFila = precio * cantidad;

    let tr = input.closest('tr');
    let rowKey = tr.getAttribute('data-row-key');
    
    let celdaTotal = tr.querySelector('.val-total');
    celdaTotal.setAttribute('data-valor', totalFila);
    celdaTotal.innerText = '$' + totalFila.toFixed(2);

    let defaultVal = input.getAttribute('data-default-val');
    if(precio.toFixed(2) !== parseFloat(defaultVal).toFixed(2)) {
        localStorage.setItem(rowKey, precio.toFixed(2));
    } else {
        localStorage.removeItem(rowKey);
    }

    let operarioId = tr.getAttribute('data-operario-id');
    recalcularSubtotalOperario(operarioId);
}

function cargarValoresPersonalizados() {
    document.querySelectorAll('tr.item-row').forEach(function(tr) {
        let rowKey = tr.getAttribute('data-row-key');
        let valorGuardado = localStorage.getItem(rowKey);
        if (valorGuardado !== null) {
            let input = tr.querySelector('.input-precio');
            input.value = parseFloat(valorGuardado).toFixed(2);
            
            let cantidad = parseInt(input.getAttribute('data-cantidad'));
            let totalFila = parseFloat(valorGuardado) * cantidad;
            let celdaTotal = tr.querySelector('.val-total');
            celdaTotal.setAttribute('data-valor', totalFila);
            celdaTotal.innerText = '$' + totalFila.toFixed(2);
        }
    });
}

function recalcularSubtotalOperario(operarioId) {
    let filas = document.querySelectorAll(`tr.item-row[data-operario-id="${operarioId}"]`);
    let subtotalCantidad = 0;
    let subtotalDinero = 0;

    filas.forEach(function(fila) {
        let cant = parseInt(fila.querySelector('.val-cantidad').innerText);
        let dinero = parseFloat(fila.querySelector('.val-total').getAttribute('data-valor'));
        
        subtotalCantidad += cant;
        subtotalDinero += dinero;
    });

    let filaSubtotal = document.querySelector(`tr.subtotal-row[data-operario-id="${operarioId}"]`);
    if (filaSubtotal) {
        filaSubtotal.querySelector('.total-cantidad').innerText = subtotalCantidad;
        filaSubtotal.querySelector('.total-dinero').innerText = '$' + subtotalDinero.toFixed(2);
    }
}

function recalcularTodoElReporte() {
    let filasSubtotales = document.querySelectorAll('tr.subtotal-row');
    filasSubtotales.forEach(function(fila) {
        let operarioId = fila.getAttribute('data-operario-id');
        recalcularSubtotalOperario(operarioId);
    });
    
    // Limpieza preventiva: Si la memoria del navegador tiene llaves antiguas con el formato viejo, las borra
    for (let i = 0; i < localStorage.length; i++) {
        let key = localStorage.key(i);
        if (key && key.startsWith('ope_') && !key.includes('_ord_')) {
            localStorage.removeItem(key);
        }
    }
}
</script>

<style>
.input-precio {
    border-radius: 0px 4px 4px 0px;
    font-size: 0.9rem;
}
@media print {
    .input-precio {
        border: none !important;
        background: transparent !important;
        box-shadow: none !important;
        text-align: right !important;
    }
    .input-group-text {
        display: none !important;
    }
}
</style>