<?php

/**
 * Promociones.php - Manejo de operaciones de promociones
 * Este archivo procesa operaciones relacionadas con las promociones
 */

// Si se accede directamente, denegar acceso
//if (!defined('BASEPATH')) exit('No direct script access allowed');
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getDetallePromocion') {
  $idPromocion = isset($datapost['idPromocion']) ? (int) $datapost['idPromocion'] : 0;

  if (empty($idPromocion)) {
    sendResponse(false, "Debe proporcionar el ID de la promoción");
  }

  try {
    // Obtener detalles básicos de la promoción
    $queryPromocion = "SELECT * FROM promocion WHERE idPromocion = ? LIMIT 1";
    $stmtPromocion = $conn->prepare($queryPromocion);
    $stmtPromocion->bind_param("i", $idPromocion);
    $stmtPromocion->execute();
    $resultPromocion = $stmtPromocion->get_result();

    if ($resultPromocion->num_rows === 0) {
      sendResponse(false, "Promoción no encontrada");
    }

    $promocion = $resultPromocion->fetch_assoc();

    $respuesta = [
      'promocion' => $promocion,
      'productosCobrar' => [],
      'productosRegalar' => []
    ];

    // Para promociones tipo 3 (combo/regalo), necesitamos obtener los productos
    if ($promocion['tipo'] === '3') {
      // Obtener productos a cobrar (los que el cliente debe comprar)
      $queryProductosCobrar = "SELECT idPlatillo 
                              FROM promocion_platillo_regalo 
                              WHERE idPromocion = ? and tipo =1";
      $stmtProductosCobrar = $conn->prepare($queryProductosCobrar);
      $stmtProductosCobrar->bind_param("i", $idPromocion);
      $stmtProductosCobrar->execute();
      $resultProductosCobrar = $stmtProductosCobrar->get_result();

      while ($row = $resultProductosCobrar->fetch_assoc()) {
        $respuesta['productosCobrar'][] = (int) $row['idPlatillo'];
      }

      // Obtener productos a regalar (los que se dan gratis en la promoción)
      $queryProductosRegalar = "SELECT idPlatillo 
                               FROM promocion_platillo_regalo 
                               WHERE idPromocion = ? and tipo =2";
      $stmtProductosRegalar = $conn->prepare($queryProductosRegalar);
      $stmtProductosRegalar->bind_param("i", $idPromocion);
      $stmtProductosRegalar->execute();
      $resultProductosRegalar = $stmtProductosRegalar->get_result();

      while ($row = $resultProductosRegalar->fetch_assoc()) {
        $respuesta['productosRegalar'][] = (int) $row['idPlatillo'];
      }
    }

    sendResponse(true, "Detalle de promoción obtenido correctamente", $respuesta);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener detalle de promoción: " . $e->getMessage());
  }
}
// Obtener promociones activas
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPromocionesActivas') {
  try {
    $fechaActual = date('Y-m-d');
    $horaActual = date('H:i:s');
    $diaSemana = date('N'); // 1 (lunes) a 7 (domingo)

    // Consultar promociones activas en la fecha y hora actual
    $query = "SELECT p.*, GROUP_CONCAT(pd.idPlatillo) as aplicaProductos 
              FROM promocion p 
              LEFT JOIN promocion_detalle pd ON p.idPromocion = pd.idPromocion 
              LEFT JOIN promocion_dia pd2 ON p.idPromocion = pd2.idPromocion 
              LEFT JOIN promocion_platillo_regalo  ON p.idPromocion  = promocion_platillo_regalo.idPromocion
              WHERE p.activar = '1' 
              AND p.fechaInicio <= ? 
              AND p.fechaFin >= ? 
              AND p.horaInicio <= ? 
              AND p.horaFin >= ? 
              AND (pd2.dia IS NULL OR pd2.dia = ?) 
              GROUP BY p.idPromocion";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("ssssi", $fechaActual, $fechaActual, $horaActual, $horaActual, $diaSemana);
    $stmt->execute();
    $result = $stmt->get_result();

    $promociones = [];
    while ($row = $result->fetch_assoc()) {
      // Convertir aplicaProductos de string a array
      $aplicaProductos = [];
      if (!empty($row['aplicaProductos'])) {
        $aplicaProductos = array_map('intval', explode(',', $row['aplicaProductos']));
      }

      $promociones[] = [
        'idPromocion' => (int) $row['idPromocion'],
        'nombre' => $row['nombre'],
        'tipo' => $row['tipo'],
        'cantidad1' => $row['cantidad1'] ?? '',
        'cantidad2' => $row['cantidad2'] ?? '',
        'descuento' => $row['descuento'] ?? 0,
        'fechaInicio' => $row['fechaInicio'],
        'fechaFin' => $row['fechaFin'],
        'horaInicio' => $row['horaInicio'],
        'horaFin' => $row['horaFin'],
        'activa' => true,
        'aplicaProductos' => $aplicaProductos,
        'aplicaLlevar' => $row['llevar'] == 1,
        'aplicaMesa' => $row['mesa'] == 1,
        'aplicaDomicilio' => $row['domicilio'] == 1,
        'platillo1' => (int) $row['platillo1'],
        'platillo2' => (int) $row['platillo2']
      ];
    }

    sendResponse(true, "Promociones activas obtenidas correctamente", $promociones);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener promociones activas: " . $e->getMessage());
  }
}

/**
 * Función para obtener los productos de una promoción tipo 3 (promoción de regalo)
 * Se debe llamar con $datapost['tipo'] = 'getProductosPromocionRegalo' y $datapost['idPromocion']
 */

// Verificar si estamos procesando la solicitud correcta
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getProductosPromocionRegalo') {
  $idPromocion = isset($datapost['idPromocion']) ? intval($datapost['idPromocion']) : 0;

  if (empty($idPromocion)) {
    sendResponse(false, "Debe proporcionar el ID de la promoción");
  }

  try {
    // Buscar productos que se cobran (tipo = 1)
    $queryCobrar = "SELECT idPlatillo FROM promocion_platillo_regalo 
                     WHERE idPromocion = ? AND tipo = 1";
    $stmtCobrar = $conn->prepare($queryCobrar);
    $stmtCobrar->bind_param("i", $idPromocion);
    $stmtCobrar->execute();
    $resultCobrar = $stmtCobrar->get_result();

    $productosCobrar = [];
    while ($row = $resultCobrar->fetch_assoc()) {
      $productosCobrar[] = intval($row['idPlatillo']);
    }

    // Buscar productos que se regalan (tipo = 2)
    $queryRegalar = "SELECT idPlatillo FROM promocion_platillo_regalo 
                      WHERE idPromocion = ? AND tipo = 2";
    $stmtRegalar = $conn->prepare($queryRegalar);
    $stmtRegalar->bind_param("i", $idPromocion);
    $stmtRegalar->execute();
    $resultRegalar = $stmtRegalar->get_result();

    $productosRegalar = [];
    while ($row = $resultRegalar->fetch_assoc()) {
      $productosRegalar[] = intval($row['idPlatillo']);
    }

    // Preparar la respuesta
    $respuesta = [
      'productosCobrar' => $productosCobrar,
      'productosRegalar' => $productosRegalar
    ];

    sendResponse(true, "Productos de promoción obtenidos correctamente", $respuesta);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener productos de la promoción: " . $e->getMessage());
  }
}
// Obtener promociones por tipo
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPromocionesPorTipo') {
  $tipoPromocion = isset($datapost['tipoPromocion']) ? $datapost['tipoPromocion'] : '';

  if (empty($tipoPromocion)) {
    sendResponse(false, "Debe proporcionar el tipo de promoción");
  }

  try {
    $fechaActual = date('Y-m-d');
    $horaActual = date('H:i:s');
    $diaSemana = date('N'); // 1 (lunes) a 7 (domingo)

    // Consultar promociones del tipo especificado
    $query = "SELECT p.*, GROUP_CONCAT(pd.idPlatillo) as aplicaProductos 
              FROM promocion p 
              LEFT JOIN promocion_detalle pd ON p.idPromocion = pd.idPromocion 
              LEFT JOIN promocion_dia pd2 ON p.idPromocion = pd2.idPromocion 
              WHERE p.activar = '1' 
              AND p.tipo = ?
              AND p.fechaInicio <= ? 
              AND p.fechaFin >= ? 
              AND p.horaInicio <= ? 
              AND p.horaFin >= ? 
              AND (pd2.dia IS NULL OR pd2.dia = ?) 
              GROUP BY p.idPromocion";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("sssssi", $tipoPromocion, $fechaActual, $fechaActual, $horaActual, $horaActual, $diaSemana);
    $stmt->execute();
    $result = $stmt->get_result();

    $promociones = [];
    while ($row = $result->fetch_assoc()) {
      // Convertir aplicaProductos de string a array
      $aplicaProductos = [];
      if (!empty($row['aplicaProductos'])) {
        $aplicaProductos = array_map('intval', explode(',', $row['aplicaProductos']));
      }

      $promociones[] = [
        'idPromocion' => (int) $row['idPromocion'],
        'nombre' => $row['nombre'],
        'tipo' => $row['tipo'],
        'cantidad1' => $row['cantidad1'] ?? '',
        'cantidad2' => $row['cantidad2'] ?? '',
        'descuento' => $row['descuento'] ?? 0,
        'fechaInicio' => $row['fechaInicio'],
        'fechaFin' => $row['fechaFin'],
        'horaInicio' => $row['horaInicio'],
        'horaFin' => $row['horaFin'],
        'activa' => true,
        'aplicaProductos' => $aplicaProductos,
        'aplicaLlevar' => $row['llevar'] == 1,
        'aplicaMesa' => $row['mesa'] == 1,
        'aplicaDomicilio' => $row['domicilio'] == 1,
        'platillo1' => (int) $row['platillo1'],
        'platillo2' => (int) $row['platillo2']
      ];
    }

    sendResponse(true, "Promociones obtenidas correctamente", $promociones);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener promociones: " . $e->getMessage());
  }
}

// Verificar promociones aplicables a un producto
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'verificarPromocionesProducto') {
  $idProducto = isset($datapost['idProducto']) ? (int) $datapost['idProducto'] : 0;

  if (empty($idProducto)) {
    sendResponse(false, "Debe proporcionar el ID del producto");
  }

  try {
    $fechaActual = date('Y-m-d');
    $horaActual = date('H:i:s');
    $diaSemana = date('N'); // 1 (lunes) a 7 (domingo)

    // Consultar promociones aplicables al producto
    $query = "SELECT p.* 
              FROM promocion p 
              JOIN promocion_detalle pd ON p.idPromocion = pd.idPromocion 
              LEFT JOIN promocion_dia pd2 ON p.idPromocion = pd2.idPromocion 
              WHERE p.activar = '1' 
              AND pd.idPlatillo = ?
              AND p.fechaInicio <= ? 
              AND p.fechaFin >= ? 
              AND p.horaInicio <= ? 
              AND p.horaFin >= ? 
              AND (pd2.dia IS NULL OR pd2.dia = ?) 
              GROUP BY p.idPromocion";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("issssi", $idProducto, $fechaActual, $fechaActual, $horaActual, $horaActual, $diaSemana);
    $stmt->execute();
    $result = $stmt->get_result();

    $promociones = [];
    while ($row = $result->fetch_assoc()) {
      // Obtener productos aplicables para esta promoción
      $queryProductos = "SELECT idPlatillo FROM promocion_detalle WHERE idPromocion = ?";
      $stmtProductos = $conn->prepare($queryProductos);
      $stmtProductos->bind_param("i", $row['idPromocion']);
      $stmtProductos->execute();
      $resultProductos = $stmtProductos->get_result();

      $aplicaProductos = [];
      while ($producto = $resultProductos->fetch_assoc()) {
        $aplicaProductos[] = (int) $producto['idPlatillo'];
      }

      $promociones[] = [
        'idPromocion' => (int) $row['idPromocion'],
        'nombre' => $row['nombre'],
        'tipo' => $row['tipo'],
        'cantidad1' => $row['cantidad1'] ?? '',
        'cantidad2' => $row['cantidad2'] ?? '',
        'descuento' => $row['descuento'] ?? 0,
        'activa' => true,
        'aplicaProductos' => $aplicaProductos
      ];
    }

    sendResponse(true, "Promociones aplicables al producto obtenidas correctamente", $promociones);
  } catch (Exception $e) {
    sendResponse(false, "Error al verificar promociones del producto: " . $e->getMessage());
  }
}

// No enviar respuesta aquí, ya que este archivo se incluye en api.php
// y puede haber otras rutas por procesar