<?php
require_once dirname(__DIR__, 2) . '/config/database.php';
require_once dirname(__DIR__, 2) . '/includes/helpers.php';

$pdo = getConnection();

$query       = trim($_GET['query'] ?? '');
$page        = max(1, (int)($_GET['page'] ?? 1));
$limit       = min(100, max(10, (int)($_GET['limit'] ?? 50)));
$offset      = ($page - 1) * $limit;
$lugarCompraId = isset($_GET['lugar_compra']) && is_numeric($_GET['lugar_compra']) ? (int)$_GET['lugar_compra'] : 0;
$fechaCompra = $_GET['fecha_compra'] ?? '';

try {
    $margenGeneral = 30;
    $stmtC = $pdo->prepare("SELECT margen_ganancia_defecto FROM sucursal_configuracion WHERE sucursal_id = ? LIMIT 1");
    $stmtC->execute([1]);
    $rowC = $stmtC->fetch();
    if ($rowC) $margenGeneral = (float)$rowC['margen_ganancia_defecto'];

    $margenesLab = [];
    $stmtL = $pdo->query("SELECT laboratorio, margen_ganancia_porcentaje FROM laboratorio_margenes");
    while ($r = $stmtL->fetch()) {
        $margenesLab[strtolower(trim($r['laboratorio']))] = (float)$r['margen_ganancia_porcentaje'];
    }

    $lugaresCompra = [];
    $stmtLC = $pdo->query("SELECT id, nombre FROM lugarcompra WHERE activo = 1 OR activo IS NULL ORDER BY nombre");
    while ($r = $stmtLC->fetch()) {
        $lugaresCompra[] = ['id' => (int)$r['id'], 'nombre' => $r['nombre']];
    }

    $fechasCompra = [];
    $stmtFC = $pdo->query("SELECT DISTINCT DATE(fecha_ultima_compra) as fecha FROM producto_lugares_compra WHERE fecha_ultima_compra IS NOT NULL AND fecha_ultima_compra != '0000-00-00' ORDER BY fecha DESC LIMIT 50");
    while ($r = $stmtFC->fetch()) {
        $fechasCompra[] = $r['fecha'];
    }

    $where = [];
    $params = [];

    if ($query !== '') {
        $q = "%$query%";
        $where[] = "(p.CodigoInterno LIKE :q1 OR p.CodigoBarra LIKE :q2 OR p.NombreComercial LIKE :q3 OR p.NombreGenerico LIKE :q4 OR p.laboratorio LIKE :q5)";
        $params[':q1'] = $q;
        $params[':q2'] = $q;
        $params[':q3'] = $q;
        $params[':q4'] = $q;
        $params[':q5'] = $q;
    }

    if ($lugarCompraId > 0) {
        $where[] = "EXISTS (SELECT 1 FROM producto_lugares_compra plc WHERE plc.producto_id = p.id AND plc.lugar_compra_id = :lid AND plc.activo = 1)";
        $params[':lid'] = $lugarCompraId;
    }

    if ($fechaCompra !== '') {
        $where[] = "EXISTS (SELECT 1 FROM producto_lugares_compra plc2 WHERE plc2.producto_id = p.id AND plc2.activo = 1 AND DATE(COALESCE(plc2.fecha_ultima_compra, plc2.fecha_creacion)) = :fcompra)";
        $params[':fcompra'] = $fechaCompra;
    }

    $whereClause = count($where) > 0 ? 'WHERE ' . implode(' AND ', $where) : '';

    $countSql = "SELECT COUNT(*) FROM productos p $whereClause";
    $stmtCount = $pdo->prepare($countSql);
    $stmtCount->execute($params);
    $total = (int)$stmtCount->fetchColumn();

    $sql = "SELECT p.id, p.CodigoInterno, p.CodigoBarra, p.NombreComercial, p.NombreGenerico,
                   p.laboratorio, p.FuncionMedica, p.exento_iva, p.estado,
                   COALESCE(pcp.costo_promedio_unidad_base, 0) as costo_base
            FROM productos p
            LEFT JOIN productos_costo_promedio pcp ON p.id = pcp.producto_id
            $whereClause
            ORDER BY p.NombreComercial ASC
            LIMIT :limit OFFSET :offset";

    $stmt = $pdo->prepare($sql);
    foreach ($params as $k => $v) {
        $stmt->bindValue($k, $v, PDO::PARAM_STR);
    }
    $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
    $stmt->execute();
    $productos = $stmt->fetchAll();

    $productIds = array_column($productos, 'id');

    $presentacionesPorProducto = [];
    if (!empty($productIds)) {
        $ids = implode(',', array_map('intval', $productIds));

        $stmtP = $pdo->query("
            SELECT pp.producto_id, pr.id as pres_id, pr.nombre as pres_nombre,
                   pp.factor_conversion, pp.precio_venta, pp.es_facturable, pp.es_unidad_base
            FROM producto_presentaciones pp
            JOIN presentaciones pr ON pp.presentacion_id = pr.id
            WHERE pp.producto_id IN ($ids) AND pp.activo = 1
            ORDER BY pp.producto_id, pp.factor_conversion ASC
        ");
        while ($r = $stmtP->fetch()) {
            $pid = $r['producto_id'];
            if (!isset($presentacionesPorProducto[$pid])) $presentacionesPorProducto[$pid] = [];
            $presentacionesPorProducto[$pid][] = [
                'id' => (int)$r['pres_id'],
                'nombre' => $r['pres_nombre'],
                'factor_conversion' => (int)$r['factor_conversion'],
                'precio_venta' => (float)$r['precio_venta'],
                'es_facturable' => (int)$r['es_facturable'],
                'es_unidad_base' => (int)$r['es_unidad_base'],
            ];
        }

        $lugaresPorProducto = [];
        $stmtLp = $pdo->query("
            SELECT plc.producto_id, lc.id as lugar_id, lc.nombre as lugar_nombre,
                   plc.costo_compra, plc.fecha_ultima_compra, plc.fecha_vencimiento,
                   plc.exento_iva
            FROM producto_lugares_compra plc
            JOIN lugarcompra lc ON plc.lugar_compra_id = lc.id
            WHERE plc.producto_id IN ($ids) AND plc.activo = 1
            ORDER BY plc.producto_id, COALESCE(plc.fecha_ultima_compra, plc.fecha_creacion, '0000-00-00') DESC
        ");
        while ($r = $stmtLp->fetch()) {
            $pid = $r['producto_id'];
            if (!isset($lugaresPorProducto[$pid])) $lugaresPorProducto[$pid] = [];
            $lugaresPorProducto[$pid][] = [
                'lugar_id' => (int)$r['lugar_id'],
                'lugar_nombre' => $r['lugar_nombre'],
                'costo_compra' => (float)$r['costo_compra'],
                'fecha_ultima_compra' => $r['fecha_ultima_compra'],
                'fecha_vencimiento' => $r['fecha_vencimiento'],
                'exento_iva' => (int)$r['exento_iva'],
            ];
        }
    }

    $data = [];
    foreach ($productos as $p) {
        $pid = $p['id'];
        $lab = $p['laboratorio'];
        $labLower = strtolower(trim($lab));

        $margenLab = $margenesLab[$labLower] ?? $margenGeneral;
        $costoUnidad = (float)$p['costo_base'];

        $presentaciones = $presentacionesPorProducto[$pid] ?? [];
        $lugares = $lugaresPorProducto[$pid] ?? [];

        $presList = [];
        $costoUnidadPres = 0;

        foreach ($presentaciones as $pp) {
            $factor = (int)$pp['factor_conversion'];
            $factor = max(1, $factor);

            $costo = $costoUnidad * $factor;
            if ($costoUnidadPres === 0 && $pp['es_unidad_base']) {
                $costoUnidadPres = $costoUnidad;
            }

            $precioVentaDB = (float)$pp['precio_venta'];
            $precioSugerido = $costo * (1 + $margenLab / 100);
            $precioFinal = $precioVentaDB > 0 ? $precioVentaDB : round($precioSugerido, 2);

            $presList[] = [
                'id' => $pp['id'],
                'nombre' => $pp['nombre'],
                'factor' => $factor,
                'costo' => round($costo, 2),
                'precio_sugerido' => round($precioSugerido, 2),
                'precio_venta' => $precioFinal,
                'es_facturable' => $pp['es_facturable'],
            ];
        }

        $ultimoCosto = $costoUnidad > 0 ? $costoUnidad : 0;
        if (!empty($lugares)) {
            $ultimo = $lugares[0];
            if ($ultimo['costo_compra'] > 0) {
                $ultimoCosto = (float)$ultimo['costo_compra'];
            }
        }

        if ($ultimoCosto > 0 && $costoUnidad === 0) {
            $costoUnidad = $ultimoCosto;
            foreach ($presList as &$pres) {
                $factor = max(1, $pres['factor']);
                $costo = $ultimoCosto * $factor;
                $pres['costo'] = round($costo, 2);
                if ($pres['precio_venta'] <= 0) {
                    $pres['precio_venta'] = round($costo * (1 + $margenLab / 100), 2);
                }
            }
            unset($pres);
        }

        $fechaCompraVal = '';
        $fechaVencVal = '';
        if (!empty($lugares)) {
            $fechaCompraVal = $lugares[0]['fecha_ultima_compra'] ?? '';
            $fechaVencVal = $lugares[0]['fecha_vencimiento'] ?? '';
            foreach ($lugares as $l) {
                if (!empty($l['fecha_vencimiento'])) {
                    if (empty($fechaVencVal) || $l['fecha_vencimiento'] < $fechaVencVal) {
                        $fechaVencVal = $l['fecha_vencimiento'];
                    }
                }
            }
        }

        $data[] = [
            'id' => (int)$pid,
            'CodigoInterno' => $p['CodigoInterno'],
            'CodigoBarra' => $p['CodigoBarra'],
            'NombreComercial' => $p['NombreComercial'],
            'NombreGenerico' => $p['NombreGenerico'],
            'FuncionMedica' => $p['FuncionMedica'],
            'laboratorio' => $lab,
            'exento_iva' => (int)$p['exento_iva'],
            'costo_unidad' => round($costoUnidad, 2),
            'margen' => $margenLab,
            'presentaciones' => $presList,
            'lugares' => $lugares,
            'fecha_compra' => $fechaCompraVal,
            'fecha_vencimiento' => $fechaVencVal,
        ];
    }

    json_success([
        'productos' => $data,
        'lugares_compra' => $lugaresCompra,
        'fechas_compra' => $fechasCompra,
        'total' => $total,
        'page' => $page,
        'pages' => max(1, ceil($total / $limit)),
    ]);

} catch (Exception $e) {
    json_error('Error: ' . $e->getMessage());
}
