<?php
/**
 * POST /api/productos/crear.php
 * Create a new product with presentations, location, inventory, and CPP
 */
require_once '../../config/database.php';
require_once '../../includes/helpers.php';
require_once '../costos/wac.php';

require_post();

$data = json_input();
require_fields($data, ['NombreComercial', 'NombreGenerico', 'laboratorio']);

$pdo = getConnection();

try {
    $pdo->beginTransaction();

    // 1. Generate internal code (first letter + sequential number)
    $firstLetter = strtoupper(substr(trim($data['NombreComercial']), 0, 1));
    if (!ctype_alpha($firstLetter)) $firstLetter = 'X';

    $stmt = $pdo->prepare(
        "SELECT CodigoInterno FROM productos WHERE CodigoInterno LIKE :prefix ORDER BY CodigoInterno DESC LIMIT 1"
    );
    $stmt->execute(['prefix' => $firstLetter . '%']);
    $lastCode = $stmt->fetchColumn();

    if ($lastCode) {
        $num = (int)substr($lastCode, 1) + 1;
        $newCode = $firstLetter . str_pad($num, 4, '0', STR_PAD_LEFT);
    } else {
        $newCode = $firstLetter . '0001';
    }

    // 2. Prepare product data
    $lugarId   = !empty($data['id_lugarCompra']) ? (int)$data['id_lugarCompra'] : null;
    $costoU    = (float)($data['CostoUnidad'] ?? 0);
    $precioU   = (float)($data['PrecioVentaUnidad'] ?? 0);
    $precioB   = (float)($data['PrecioVentaBlister'] ?? 0);
    $precioM   = (float)($data['PrecioVentaMayor'] ?? 0);
    $existencia = (int)($data['existencia'] ?? 0);
    $exentoIva = !empty($data['exento_iva']) ? 1 : 0;
    $conFactura = !empty($data['con_factura']) ? 1 : 0;
    $fechaVenc = $data['FechaVencimiento'] ?? null;
    $funcion   = $data['FuncionMedica'] ?? null;
    $fechaIngreso = date('Y-m-d');

    // 3. Insert product (Only basic columns)
    $sql = "INSERT INTO productos (
        CodigoInterno, CodigoBarra, NombreComercial, NombreGenerico, laboratorio,
        exento_iva, se_factura, FuncionMedica
    ) VALUES (
        :codigo, :barra, :comercial, :generico, :lab,
        :iva, :se_factura, :funcion
    )";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        'codigo'    => $newCode,
        'barra'     => $data['CodigoBarra'] ?? '',
        'comercial' => $data['NombreComercial'],
        'generico'  => $data['NombreGenerico'],
        'lab'       => $data['laboratorio'],
        'iva'       => $exentoIva,
        'se_factura'=> $conFactura,
        'funcion'   => $funcion,
    ]);
    $productoId = (int)$pdo->lastInsertId();

    // 4. Compute stock in units
    $unidadesPorCaja = (int)($data['unidades_por_caja'] ?? 0);
    $stockEnUnidades = $unidadesPorCaja > 0 ? $existencia * $unidadesPorCaja : $existencia;

    // 5. Create Location Records
    $generalId = get_general_id($pdo);
    
    // General
    $pdo->prepare(
        "INSERT INTO producto_lugares_compra
         (producto_id, lugar_compra_id, costo_compra, fecha_ultima_compra, fecha_vencimiento, con_factura, exento_iva, activo, fecha_ingreso)
         VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?)"
    )->execute([
        $productoId, $generalId, $costoU, $fechaIngreso,
        $fechaVenc, $conFactura, $exentoIva, $fechaIngreso
    ]);

    // Specific Location (if provided and different)
    if ($lugarId && $lugarId !== $generalId) {
        $pdo->prepare(
            "INSERT INTO producto_lugares_compra
             (producto_id, lugar_compra_id, costo_compra, fecha_ultima_compra, fecha_vencimiento, con_factura, exento_iva, activo, fecha_ingreso)
             VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?)"
        )->execute([
            $productoId, $lugarId, $costoU, $fechaIngreso,
            $fechaVenc, $conFactura, $exentoIva, $fechaIngreso
        ]);
    }

    // 6. Insert presentations
    $presMap = [];
    $resPres = $pdo->query("SELECT id, nombre FROM presentaciones WHERE activo = 1");
    while ($r = $resPres->fetch()) {
        $presMap[strtolower(trim($r['nombre']))] = (int)$r['id'];
    }

    $stmtPres = $pdo->prepare(
        "INSERT INTO producto_presentaciones 
        (producto_id, presentacion_id, factor_conversion, activo, es_unidad_base, 
         precio_venta, es_facturable, es_comprable, es_vendible, fecha_creacion) 
        VALUES (?, ?, ?, 1, ?, ?, 1, 1, 1, NOW())"
    );

    // Unidad (always)
    if (isset($presMap['unidad'])) {
        $stmtPres->execute([$productoId, $presMap['unidad'], 1, 1, $precioU]);
    }
    // Caja
    if ($unidadesPorCaja > 0 && isset($presMap['caja'])) {
        $stmtPres->execute([$productoId, $presMap['caja'], $unidadesPorCaja, 0, $precioM]);
    }
    // Blister
    $unidadesPorBlister = (int)($data['unidades_por_blister'] ?? 0);
    if ($unidadesPorBlister > 0 && isset($presMap['blister'])) {
        $stmtPres->execute([$productoId, $presMap['blister'], $unidadesPorBlister, 0, $precioB]);
    }

    // 7. Initial Inventory (inventario_sucursal)
    if ($stockEnUnidades > 0) {
        $stockFact = $conFactura ? $stockEnUnidades : 0;
        $stockNoFact = $conFactura ? 0 : $stockEnUnidades;
        
        $stmtInv = $pdo->prepare("INSERT INTO inventario_sucursal 
            (producto_id, sucursal_id, stock_total, stock_facturado, stock_no_facturado, costo_promedio_local)
            VALUES (?, 1, ?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE 
                stock_total = stock_total + VALUES(stock_total),
                stock_facturado = stock_facturado + VALUES(stock_facturado),
                stock_no_facturado = stock_no_facturado + VALUES(stock_no_facturado)");
        $stmtInv->execute([$productoId, $stockEnUnidades, $stockFact, $stockNoFact, $costoU]);
    }
    
    // 8. Costo Promedio (CPP)
    $valorTotal = round($costoU * $stockEnUnidades, 2);
    $stmtCPP = $pdo->prepare("INSERT INTO productos_costo_promedio 
        (producto_id, costo_promedio_unidad_base, cantidad_total_unidades, valor_total_inventario)
        VALUES (?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE 
            costo_promedio_unidad_base = VALUES(costo_promedio_unidad_base),
            cantidad_total_unidades = VALUES(cantidad_total_unidades),
            valor_total_inventario = VALUES(valor_total_inventario)");
    $stmtCPP->execute([$productoId, $costoU, $stockEnUnidades, $valorTotal]);

    $pdo->commit();

    // 9. Register initial purchase in Bitácora (compras / compras_detalle) if stock > 0
    if ($stockEnUnidades > 0 && $costoU > 0) {
        try {
            $stmtC = $pdo->prepare("INSERT INTO compras (fecha_compra, id_lugarCompra, total, tipo_pago, estado_pago) VALUES (?, ?, ?, 'contado', 'pendiente')");
            $stmtC->execute([$fechaIngreso, $lugarId ?: $generalId, $costoU * $stockEnUnidades]);
            $compraId = $pdo->lastInsertId();

            $stmtD = $pdo->prepare("INSERT INTO compras_detalle (compra_id, producto_id, cantidad, costo_unitario, costo_total, fecha_vencimiento) VALUES (?, ?, ?, ?, ?, ?)");
            $stmtD->execute([$compraId, $productoId, $stockEnUnidades, $costoU, $costoU * $stockEnUnidades, $fechaVenc]);
        } catch (Exception $e) {
            // Log error but don't fail product creation
            error_log("Error recording initial bitácora: " . $e->getMessage());
        }
    }

    json_success([
        'producto_id'   => $productoId,
        'CodigoInterno' => $newCode,
    ], 'Producto agregado exitosamente');

} catch (Exception $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    json_error('Error al crear producto: ' . $e->getMessage());
}
