<?php
session_start();
require_once 'db/config.php';

// Verificar si el usuario está logueado y es Administrador
if (!isset($_SESSION['user_id']) || !in_array($_SESSION['user_role'], ['Administrador', 'admin'])) {
    header('Location: login.php');
    exit;
}

// Manejar acciones GET (como eliminar desde un enlace)
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['action'])) {
    $db_get = db();
    try {
        if ($_GET['action'] === 'remove_product' && isset($_GET['reporte_id']) && isset($_GET['product_id'])) {
            $stmt = $db_get->prepare("DELETE FROM rentabilidad_productos WHERE reporte_id = ? AND product_id = ?");
            $stmt->execute([$_GET['reporte_id'], $_GET['product_id']]);
            $_SESSION['message'] = '<div class="alert alert-info">Producto eliminado de este reporte.</div>';
        }
    } catch (PDOException $e) {
        $_SESSION['message'] = '<div class="alert alert-danger">Error de base de datos: ' . $e->getMessage() . '</div>';
    }
    header('Location: rentabilidad.php');
    exit;
}

$db = db();
$message = '';

// Manejar las acciones del formulario (POST requests)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
    try {
        switch ($_POST['action']) {
            case 'create_report':
                // 1. Crear el reporte
                $stmt = $db->prepare("INSERT INTO rentabilidad_reportes (fecha_inicio, fecha_fin) VALUES (CURDATE(), CURDATE())");
                $stmt->execute();
                $reporte_id = $db->lastInsertId();

                // 2. Poblar el reporte con todos los productos existentes
                $products_stmt = $db->query("SELECT id FROM products");
                $products_ids = $products_stmt->fetchAll(PDO::FETCH_COLUMN);
                
                $insert_sql = "INSERT INTO rentabilidad_productos (reporte_id, product_id) VALUES (:reporte_id, :product_id)";
                $insert_stmt = $db->prepare($insert_sql);
                foreach ($products_ids as $product_id) {
                    $insert_stmt->execute([':reporte_id' => $reporte_id, ':product_id' => $product_id]);
                }

                $_SESSION['message'] = '<div class="alert alert-success">Nuevo reporte creado y poblado con todos los productos.</div>';
                break;

            case 'delete_report':
                if (isset($_POST['reporte_id'])) {
                    $stmt = $db->prepare("DELETE FROM rentabilidad_reportes WHERE id = ?");
                    $stmt->execute([$_POST['reporte_id']]);
                    // Los productos asociados se borran en cascada por la BD
                    $_SESSION['message'] = '<div class="alert alert-success">Reporte eliminado correctamente.</div>';
                }
                break;

            

            case 'save_report':
                if (isset($_POST['reporte_id']) && isset($_POST['fecha_inicio']) && isset($_POST['fecha_fin'])) {
                    $reporte_id = $_POST['reporte_id'];
                    
                    $stmt = $db->prepare("UPDATE rentabilidad_reportes SET fecha_inicio = ?, fecha_fin = ? WHERE id = ?");
                    $stmt->execute([$_POST['fecha_inicio'], $_POST['fecha_fin'], $reporte_id]);

                    if (isset($_POST['productos'])) {
                        $sql = "INSERT INTO rentabilidad_productos (reporte_id, product_id, recaudo, recaudo_ct, unidades_vendidas, unidades_vendidas_ct, costo_producto, costo_ads, comision) 
                                VALUES (:reporte_id, :product_id, :recaudo, :recaudo_ct, :unidades_vendidas, :unidades_vendidas_ct, :costo_producto, :costo_ads, :comision)
                                ON DUPLICATE KEY UPDATE 
                                recaudo = VALUES(recaudo), 
                                recaudo_ct = VALUES(recaudo_ct), 
                                unidades_vendidas = VALUES(unidades_vendidas), 
                                unidades_vendidas_ct = VALUES(unidades_vendidas_ct),
                                costo_producto = VALUES(costo_producto),
                                costo_ads = VALUES(costo_ads), 
                                comision = VALUES(comision)";
                        $stmt = $db->prepare($sql);

                        foreach ($_POST['productos'] as $product_id => $data) {
                            $stmt->execute([
                                ':reporte_id' => $reporte_id,
                                ':product_id' => $product_id,
                                ':recaudo' => $data['recaudo'] ?: 0,
                                ':recaudo_ct' => $data['recaudo_ct'] ?: 0,
                                ':unidades_vendidas' => $data['unidades_vendidas'] ?: 0,
                                ':unidades_vendidas_ct' => $data['unidades_vendidas_ct'] ?: 0,
                                ':costo_producto' => $data['costo_producto'] ?: 0,
                                ':costo_ads' => $data['costo_ads'] ?: 0,
                                ':comision' => $data['comision'] ?: 0,
                            ]);
                        }
                    }
                    $_SESSION['message'] = '<div class="alert alert-success">Reporte guardado correctamente.</div>';
                }
                break;
            
            case 'remove_product':
                if (isset($_POST['reporte_id']) && isset($_POST['product_id'])) {
                    $stmt = $db->prepare("DELETE FROM rentabilidad_productos WHERE reporte_id = ? AND product_id = ?");
                    $stmt->execute([$_POST['reporte_id'], $_POST['product_id']]);
                    $_SESSION['message'] = '<div class="alert alert-info">Producto eliminado de este reporte.</div>';
                }
                break;

            case 'add_product':
                 if (isset($_POST['reporte_id']) && isset($_POST['product_id']) && !empty($_POST['product_id'])) {
                    $stmt = $db->prepare("INSERT IGNORE INTO rentabilidad_productos (reporte_id, product_id) VALUES (?, ?)");
                    $stmt->execute([$_POST['reporte_id'], $_POST['product_id']]);
                    $_SESSION['message'] = '<div class="alert alert-success">Producto añadido al reporte.</div>';
                }
                break;
        }
    } catch (PDOException $e) {
        $_SESSION['message'] = '<div class="alert alert-danger">Error de base de datos: ' . $e->getMessage() . '</div>';
    }
    
    header('Location: rentabilidad.php');
    exit;
}

if (isset($_SESSION['message'])) {
    $message = $_SESSION['message'];
    unset($_SESSION['message']);
}

// --- Carga de datos ---
$master_products = [];
try {
    $products_stmt = $db->query("SELECT id, nombre as name, costo FROM products ORDER BY name ASC");
    $master_products = $products_stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    $message .= '<div class="alert alert-danger">Error al cargar productos.</div>';
}

$reports = [];
try {
    $reports_stmt = $db->query("SELECT * FROM rentabilidad_reportes ORDER BY fecha_inicio DESC, id DESC");
    $reports = $reports_stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    $message .= '<div class="alert alert-danger">Error al cargar reportes.</div>';
}

$report_data = [];
try {
    $report_data_stmt = $db->query("SELECT * FROM rentabilidad_productos");
    $report_data_flat = $report_data_stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($report_data_flat as $item) {
        $report_data[$item['reporte_id']][$item['product_id']] = $item;
    }
} catch (PDOException $e) {
    $message .= '<div class="alert alert-danger">Error al cargar datos de rentabilidad.</div>';
}

$pageTitle = "Reportes de Rentabilidad";
include 'layout_header.php';
?>

<?php if(!empty($message)) echo $message; ?>

<div class="card mb-4">
    <div class="card-header"><h3 class="card-title">Gestión de Reportes</h3></div>
    <div class="card-body">
        <form method="POST" action="rentabilidad.php">
            <input type="hidden" name="action" value="create_report">
            <button type="submit" class="btn btn-primary"><i class="fas fa-plus"></i> Crear Nuevo Reporte de Rentabilidad</button>
        </form>
    </div>
</div>

<?php if (empty($reports)): ?>
    <div class="alert alert-info">No hay reportes. ¡Crea uno para empezar!</div>
<?php endif; ?>

<?php foreach ($reports as $report): ?>
<div class="card mb-4" id="reporte-<?php echo $report['id']; ?>">
    <form action="rentabilidad.php" method="POST">
        <input type="hidden" name="reporte_id" value="<?php echo $report['id']; ?>">
        
        <div class="card-header">
            <div class="d-flex justify-content-between align-items-center">
                <h5 class="mb-0">Reporte de Rentabilidad</h5>
                <?php if (isset($report['fecha_creacion'])): ?>
                <small class="text-muted">Registrado el: <?php echo date("d/m/Y", strtotime($report['fecha_creacion'])); ?></small>
                <?php endif; ?>
            </div>
            <hr class="my-2">
            <div class="d-flex justify-content-between align-items-center">
                <div class="d-flex flex-row align-items-center">
                    <span class="mr-2" style="font-size: 0.9rem;">Periodo del</span>
                    <input type="date" name="fecha_inicio" class="form-control form-control-sm mr-2" style="width: auto;" value="<?php echo htmlspecialchars($report['fecha_inicio']); ?>">
                    <span class="mr-2" style="font-size: 0.9rem;">al</span>
                    <input type="date" name="fecha_fin" class="form-control form-control-sm" style="width: auto;" value="<?php echo htmlspecialchars($report['fecha_fin']); ?>">
                </div>
                <div>
                    <button type="submit" name="action" value="save_report" class="btn btn-success"><i class="fas fa-save"></i> Guardar Reporte</button>
                    
                </div>
            </div>
        </div>

        <div class="card-body">
            <div class="table-responsive">
                <table class="table table-bordered table-striped">
                    <thead class="text-center">
                        <tr>
                            <th rowspan="2" class="align-middle">Producto</th>
                            <th colspan="2">Recaudo envios</th>
                            <th colspan="2">Recaudo Contraentrega</th>
                            <th rowspan="2" class="align-middle">Costo Producto</th>
                            <th rowspan="2" class="align-middle">Costo Ads</th>
                            <th rowspan="2" class="align-middle">Comisión</th>
                            <th rowspan="2" class="align-middle">Utilidad</th>
                            <th rowspan="2" class="align-middle">Acciones</th>
                        </tr>
                        <tr>
                            <th>Recaudo Env</th>
                            <th>Unds Vendidas Env</th>
                            <th>Recaudo CT</th>
                            <th>Uds vendidas CT</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                        // Obtener los IDs de productos que están en este reporte
                        $product_ids_in_report = array_keys($report_data[$report['id']] ?? []);
                        $products_in_report = array_filter($master_products, function($p) use ($product_ids_in_report) {
                            return in_array($p['id'], $product_ids_in_report);
                        });

                        // Calcular utilidad para cada producto y almacenar en un nuevo array
                        $products_with_utility = [];
                        $total_recaudo_env = 0;
                        $total_recaudo_ct = 0;
                        $total_unidades_env = 0;
                        $total_unidades_ct = 0;
                        $total_costo_producto_sum = 0;
                        $total_costo_ads = 0;
                        $total_comision = 0;
                        $total_utilidad = 0;

                        foreach ($products_in_report as $product) {
                            $report_product_data = $report_data[$report['id']][$product['id']] ?? null;
                            
                            $recaudo = $report_product_data['recaudo'] ?? 0;
                            $recaudo_ct = $report_product_data['recaudo_ct'] ?? 0;
                            $unidades_vendidas = $report_product_data['unidades_vendidas'] ?? 0;
                            $unidades_vendidas_ct = $report_product_data['unidades_vendidas_ct'] ?? 0;
                            $costo_producto = $report_product_data['costo_producto'] ?? $product['costo'];
                            $costo_ads = $report_product_data['costo_ads'] ?? 0;
                            $comision = $report_product_data['comision'] ?? 0;
                            
                            $utilidad = (floatval($recaudo) + floatval($recaudo_ct)) - ((intval($unidades_vendidas) + intval($unidades_vendidas_ct)) * floatval($costo_producto)) - floatval($costo_ads) - floatval($comision);

                            $products_with_utility[] = [
                                'product' => $product,
                                'utilidad' => $utilidad,
                                'recaudo' => $recaudo,
                                'recaudo_ct' => $recaudo_ct,
                                'unidades_vendidas' => $unidades_vendidas,
                                'unidades_vendidas_ct' => $unidades_vendidas_ct,
                                'costo_producto' => $costo_producto,
                                'costo_ads' => $costo_ads,
                                'comision' => $comision,
                            ];
                            
                            $total_recaudo_env += $recaudo;
                            $total_recaudo_ct += $recaudo_ct;
                            $total_unidades_env += $unidades_vendidas;
                            $total_unidades_ct += $unidades_vendidas_ct;
                            $total_costo_producto_sum += (intval($unidades_vendidas) + intval($unidades_vendidas_ct)) * floatval($costo_producto);
                            $total_costo_ads += $costo_ads;
                            $total_comision += $comision;
                            $total_utilidad += $utilidad;
                        }

                        // Ordenar el array por utilidad de mayor a menor
                        usort($products_with_utility, function($a, $b) {
                            return $b['utilidad'] <=> $a['utilidad'];
                        });
                        ?>
                        <?php foreach ($products_with_utility as $item): ?>
                            <?php
                                $product = $item['product'];
                                $utilidad = $item['utilidad'];
                                $recaudo = $item['recaudo'];
                                $recaudo_ct = $item['recaudo_ct'];
                                $unidades_vendidas = $item['unidades_vendidas'];
                                $unidades_vendidas_ct = $item['unidades_vendidas_ct'];
                                $costo_producto = $item['costo_producto'];
                                $costo_ads = $item['costo_ads'];
                                $comision = $item['comision'];
                            ?>
                            <tr class="product-row">
                                <td><?php echo htmlspecialchars($product['name']); ?></td>
                                <td><input type="number" step="0.01" name="productos[<?php echo $product['id']; ?>][recaudo]" value="<?php echo $recaudo; ?>" class="form-control calc-field recaudo-env"></td>
                                <td><input type="number" step="1" name="productos[<?php echo $product['id']; ?>][unidades_vendidas]" value="<?php echo $unidades_vendidas; ?>" class="form-control calc-field unidades-vendidas-env"></td>
                                <td><input type="number" step="0.01" name="productos[<?php echo $product['id']; ?>][recaudo_ct]" value="<?php echo $recaudo_ct; ?>" class="form-control calc-field recaudo-ct"></td>
                                <td><input type="number" step="1" name="productos[<?php echo $product['id']; ?>][unidades_vendidas_ct]" value="<?php echo $unidades_vendidas_ct; ?>" class="form-control calc-field unidades-vendidas-ct"></td>
                                <td><input type="number" step="0.01" name="productos[<?php echo $product['id']; ?>][costo_producto]" value="<?php echo $costo_producto; ?>" class="form-control calc-field costo-producto"></td>
                                <td><input type="number" step="0.01" name="productos[<?php echo $product['id']; ?>][costo_ads]" value="<?php echo $costo_ads; ?>" class="form-control calc-field costo-ads"></td>
                                <td><input type="number" step="0.01" name="productos[<?php echo $product['id']; ?>][comision]" value="<?php echo $comision; ?>" class="form-control calc-field comision"></td>
                                <td class="text-center align-middle utilidad-cell"><strong>S/ <?php echo number_format($utilidad, 2); ?></strong></td>
                                <td class="text-center align-middle">
                                    <div class="dropdown">
                                        <button class="btn btn-secondary btn-sm dropdown-toggle" type="button" id="actions-<?php echo $product['id']; ?>-<?php echo $report['id']; ?>" data-bs-toggle="dropdown" aria-expanded="false">
                                            Acciones
                                        </button>
                                        <ul class="dropdown-menu" aria-labelledby="actions-<?php echo $product['id']; ?>-<?php echo $report['id']; ?>">
                                            <li>
                                                <a href="rentabilidad.php?action=remove_product&reporte_id=<?php echo $report['id']; ?>&product_id=<?php echo $product['id']; ?>" 
                                                   class="dropdown-item text-danger" 
                                                   onclick="return confirm('¿Estás seguro de que quieres quitar este producto del reporte?');">
                                                   Eliminar
                                                </a>
                                            </li>
                                        </ul>
                                    </div>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                         <?php if (empty($products_in_report)): ?>
                            <tr><td colspan="10" class="text-center">No hay productos en este reporte. Añade uno para empezar.</td></tr>
                        <?php endif; ?>
                    </tbody>
                    <tfoot class="text-center table-dark">
                        <tr>
                            <th>TOTALES</th>
                            <th id="total-recaudo-env-<?php echo $report['id']; ?>">S/ <?php echo number_format($total_recaudo_env, 2); ?></th>
                            <th id="total-unidades-env-<?php echo $report['id']; ?>"><?php echo $total_unidades_env; ?></th>
                            <th id="total-recaudo-ct-<?php echo $report['id']; ?>">S/ <?php echo number_format($total_recaudo_ct, 2); ?></th>
                            <th id="total-unidades-ct-<?php echo $report['id']; ?>"><?php echo $total_unidades_ct; ?></th>
                            <th id="total-costo-producto-<?php echo $report['id']; ?>">S/ <?php echo number_format($total_costo_producto_sum, 2); ?></th>
                            <th id="total-costo-ads-<?php echo $report['id']; ?>">S/ <?php echo number_format($total_costo_ads, 2); ?></th>
                            <th id="total-comision-<?php echo $report['id']; ?>">S/ <?php echo number_format($total_comision, 2); ?></th>
                            <th id="total-utilidad-<?php echo $report['id']; ?>">S/ <?php echo number_format($total_utilidad, 2); ?></th>
                            <th></th>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
    </form> <!-- Fin del form de guardar -->
    
    <div class="card-footer">
        <div class="d-flex justify-content-between align-items-center">
            <div>
                <form action="rentabilidad.php" method="POST" class="form-inline">
                    <input type="hidden" name="action" value="add_product">
                    <input type="hidden" name="reporte_id" value="<?php echo $report['id']; ?>">
                    <select name="product_id" class="form-control form-control-sm mr-2">
                        <option value="">-- Selecciona un producto para añadir --</option>
                        <?php
                        $products_not_in_report = array_filter($master_products, function($p) use ($product_ids_in_report) {
                            return !in_array($p['id'], $product_ids_in_report);
                        });
                        foreach ($products_not_in_report as $product) {
                            echo '<option value="' . $product['id'] . '">' . htmlspecialchars($product['name']) . '</option>';
                        }
                        ?>
                    </select>
                    <button type="submit" class="btn btn-info btn-sm"><i class="fas fa-plus"></i> Añadir Producto</button>
                </form>
            </div>
            <div>
                 <small class="text-muted mr-3">ID del Reporte: <?php echo $report['id']; ?></small>
                 <button type="button" class="btn btn-danger" onclick="document.getElementById('delete-form-<?php echo $report['id']; ?>').submit();"><i class="fas fa-trash"></i> Eliminar Reporte</button>
            </div>
        </div>
    </div>
    
    <form id="delete-form-<?php echo $report['id']; ?>" action="rentabilidad.php" method="POST" onsubmit="return confirm('¿Estás seguro de que quieres eliminar este reporte completo? Esta acción no se puede deshacer.');" style="display: none;">
        <input type="hidden" name="action" value="delete_report">
        <input type="hidden" name="reporte_id" value="<?php echo $report['id']; ?>">
    </form>
</div>
<?php endforeach; ?>

<script>
document.addEventListener('DOMContentLoaded', function() {
    function updateTotals(card) {
        let totalRecaudoEnv = 0;
        let totalUnidadesEnv = 0;
        let totalRecaudoCt = 0;
        let totalUnidadesCt = 0;
        let totalCostoProductoSum = 0;
        let totalCostoAds = 0;
        let totalComision = 0;
        let totalUtilidad = 0;

        card.querySelectorAll('.product-row').forEach(row => {
            const recaudoEnv = parseFloat(row.querySelector('.recaudo-env').value) || 0;
            const unidadesVendidasEnv = parseInt(row.querySelector('.unidades-vendidas-env').value) || 0;
            const recaudoCt = parseFloat(row.querySelector('.recaudo-ct').value) || 0;
            const unidadesVendidasCt = parseInt(row.querySelector('.unidades-vendidas-ct').value) || 0;
            const costoProducto = parseFloat(row.querySelector('.costo-producto').value) || 0;
            const costoAds = parseFloat(row.querySelector('.costo-ads').value) || 0;
            const comision = parseFloat(row.querySelector('.comision').value) || 0;
            
            const utilidad = (recaudoEnv + recaudoCt) - ((unidadesVendidasEnv + unidadesVendidasCt) * costoProducto) - costoAds - comision;

            totalRecaudoEnv += recaudoEnv;
            totalUnidadesEnv += unidadesVendidasEnv;
            totalRecaudoCt += recaudoCt;
            totalUnidadesCt += unidadesVendidasCt;
            totalCostoProductoSum += (unidadesVendidasEnv + unidadesVendidasCt) * costoProducto;
            totalCostoAds += costoAds;
            totalComision += comision;
            totalUtilidad += utilidad;
        });

        const reportId = card.id.split('-')[1];

        const formatCurrency = (value) => 'S/ ' + value.toFixed(2);

        card.querySelector(`#total-recaudo-env-${reportId}`).textContent = formatCurrency(totalRecaudoEnv);
        card.querySelector(`#total-unidades-env-${reportId}`).textContent = totalUnidadesEnv;
        card.querySelector(`#total-recaudo-ct-${reportId}`).textContent = formatCurrency(totalRecaudoCt);
        card.querySelector(`#total-unidades-ct-${reportId}`).textContent = totalUnidadesCt;
        card.querySelector(`#total-costo-producto-${reportId}`).textContent = formatCurrency(totalCostoProductoSum);
        card.querySelector(`#total-costo-ads-${reportId}`).textContent = formatCurrency(totalCostoAds);
        card.querySelector(`#total-comision-${reportId}`).textContent = formatCurrency(totalComision);
        card.querySelector(`#total-utilidad-${reportId}`).textContent = formatCurrency(totalUtilidad);
    }

    function updateUtility(row) {
        const recaudoEnv = parseFloat(row.querySelector('.recaudo-env').value) || 0;
        const unidadesVendidasEnv = parseInt(row.querySelector('.unidades-vendidas-env').value) || 0;
        const recaudoCt = parseFloat(row.querySelector('.recaudo-ct').value) || 0;
        const unidadesVendidasCt = parseInt(row.querySelector('.unidades-vendidas-ct').value) || 0;
        const costoProducto = parseFloat(row.querySelector('.costo-producto').value) || 0;
        const costoAds = parseFloat(row.querySelector('.costo-ads').value) || 0;
        const comision = parseFloat(row.querySelector('.comision').value) || 0;

        const totalRecaudo = recaudoEnv + recaudoCt;
        const totalUnidades = unidadesVendidasEnv + unidadesVendidasCt;

        const utilidad = totalRecaudo - (totalUnidades * costoProducto) - costoAds - comision;

        const utilidadCell = row.querySelector('.utilidad-cell strong');
        if (utilidadCell) {
            utilidadCell.textContent = 'S/ ' + utilidad.toFixed(2);
        }
    }

    document.querySelectorAll('.card.mb-4[id^="reporte-"]').forEach(card => {
        card.querySelectorAll('.calc-field').forEach(field => {
            field.addEventListener('input', () => {
                const row = field.closest('.product-row');
                updateUtility(row);
                updateTotals(card);
            });
        });
    });
});
</script>

<?php include 'layout_footer.php'; ?>
