<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Crons extends CI_Controller {

	public function __construct() {
		parent::__construct();

		$this->load->model('Cron_model', 'Cron', true);
	}

	/**
	 * Actualiza rankings de productos
	 */
	public function actualiza_rankings($confirmacion = 0) {

		$result = $this->Producto->actualiza_rankings($confirmacion);
		if ($confirmacion) {
			// Guarda cambios en log de cambios
			$data = [
				'id_tipo_cron' => 1,
				'data' => json_encode($result)
			];
			$this->Cron->save($data);
		}
		else {
			pr($result);
		}
		die;
	}

	/**
	 * Actualiza rankings de productos
	 */
	public function actualiza_ofertas() {
		$result = $this->Producto->actualiza_categoria_ofertas();
		pr($result);
		// Guarda log
		$data = [
			'id_tipo_cron' => 2,
			'data' => json_encode($result)
		];
		$this->Cron->save($data);
		die;
	}

	/**
	 * Actualiza recien llegados
	 */
	public function actualiza_llegados() {
		$result = $this->Producto->actualiza_recien_llegados();
		pr($result);
		// Guarda log
		$data = [
			'id_tipo_cron' => 3,
			'data' => json_encode($result)
		];
		$this->Cron->save($data);
		die;
	}

	/**
	 * Actualiza recien llegados
	 */
	public function actualiza_precios() {
		$result = $this->Producto->actualiza_precios();
		pr($result);
		// Guarda log
		$data = [
			'id_tipo_cron' => 4,
			'data' => json_encode($result)
		];
		$this->Cron->save($data);
		die;
	}

	/**
	 * Envía encuestas para clientes que se registraron y se sucribieron al email en las tiendas físicas
	 */
/*
	public function envia_encuestas() {
		// Canales que generan encuesta
		$canales = $this->Venta->get_canales(['genera_encuesta' => 1]);
		$canales_ids = array_keys($canales);
		if (empty($canales_ids)) return;
		
		// Ventas del día anterior sin encuesta
		$ayer = date('Y-m-d', strtotime('-1 day'));

		$this->db->select('v.id, v.id_canal, v.id_punto_venta, v.id_cliente, v.created, c.email, c.ps_id')
			->from('ventas v')
			->join('clientes c', 'c.id = v.id_cliente')
			->where_in('v.id_canal', $canales_ids)
			->where('DATE(v.created)', $ayer)
			->where('v.fecha_encuesta', '0000-00-00 00:00:00')
			->where('c.ps_id !=', 0);

		$ventas = $this->db->get()->result_array();

		if (empty($ventas)) return;

		$ps = $this->load->database('prestashop', TRUE);

		foreach ($ventas as $venta) {
			// 3. Verificar newsletter en PrestaShop
			$ps_cliente = $ps->select('newsletter')
				->from('ps_customer')
				->where('id_customer', $venta['ps_id'])
				->get()->row_array();

			if (empty($ps_cliente) || $ps_cliente['newsletter'] != 1) continue; // No suscrito

			// 4. Generar hash aleatorio
			// Define un secreto en config o en esta clase
			$secret = 'Dementito';

			// Generar hash único por venta
			$hash_data = $venta['id'] . '|' . $venta['id_canal'] . '|' . $venta['id_punto_venta'] . '|' . $venta['created'];
			$hash = hash_hmac('sha256', $hash_data, $secret);

			// 5. Insertar en encuestas
			$this->db->insert('encuestas_enviadas', [
				'id_venta'       => $venta['id'],
				'id_cliente'     => $venta['id_cliente'],
				'id_canal'       => $venta['id_canal'],
				'id_punto_venta' => $venta['id_punto_venta'],
				'email'          => $venta['email'],
				'hash'           => $hash,
				'fecha_envio'    => date('Y-m-d H:i:s')
			]);

			// 6. Enviar correo
			/*
			$to = $venta['email'];
			$subject = 'Ayúdanos a seguir mejorando, compártenos tu experiencia en DeMente Games';
			$message = $this->load->view('encuestas/tienda', $data , true);

			$this->load->model('Email_model', 'Email');
			$result = $this->Email->send_email($to, $subject, $message);
			**

			// 7. Marcar venta con fecha_encuesta
			$this->db->where('id', $venta['id'])->update('ventas', [
				'fecha_encuesta' => date('Y-m-d H:i:s')
			]);
		}
	}
*/
	//ChatGPT 07/05/2026 // Se debe testear
	public function envia_encuestas($confirmar = 0) {
		// =========================
		// ENCUESTAS ACTIVAS
		// =========================
		$encuestas = $this->db->select('id, id_canal')
			->from('encuestas')
			->where('id_tipo_encuesta', 1) // satisfaccion
			->where('activo', 1)
			->get()
			->result_array();

		if (empty($encuestas)) {

			echo 'No hay encuestas activas.';
			return;
		}

		$encuestas_map = [];
		$canales_ids = [];

		foreach ($encuestas as $encuesta) {

			$encuestas_map[$encuesta['id_canal']] = $encuesta['id'];
			$canales_ids[] = $encuesta['id_canal'];
		}

		$canales_ids = array_unique($canales_ids);

		$ayer_ini = date('Y-m-d 00:00:00', strtotime('-1 day'));
		$ayer_fin = date('Y-m-d 23:59:59', strtotime('-1 day'));

		// =========================
		// VENTAS
		// =========================
		$this->db->select('
				v.id,
				v.id_canal,
				v.id_punto_venta,
				v.id_cliente,
				v.created,
				v.fecha_venta,
				c.nombre,
				c.email,
				c.ps_id
			')
			->from('ventas v')
			->join('clientes c', 'c.id = v.id_cliente')

			// Debe tener al menos un producto
			// cuya categoría genere encuesta
			->join('productos_ventas pv', 'pv.id_venta = v.id')
			->join('productos p', 'p.id = pv.id_producto')
			->join('categorias cp', 'cp.id = p.id_categoria')

			->where_in('v.id_canal', $canales_ids)

			// Solo entregadas
			->where('v.id_estado_venta', 5)

			// Día anterior
			->where('v.fecha_venta >=', $ayer_ini)
			->where('v.fecha_venta <=', $ayer_fin)

			// Sin encuesta enviada
			->where('v.fecha_encuesta', '0000-00-00 00:00:00')

			// Cliente válido
			->where('c.email !=', '')
			->where('c.ps_id !=', 0)

			// Categoría válida
			->where('cp.genera_encuesta', 1)

			// Una venta por cliente por día
			->group_by('v.id_cliente')

			// Usar la venta más reciente
			->order_by('v.fecha_venta', 'DESC');

		$ventas = $this->db->get()->result_array();

		if (empty($ventas)) {

			echo 'No hay ventas pendientes.';
			return;
		}

		// =========================
		// PRESTASHOP
		// =========================
		$ps = $this->load->database('prestashop', TRUE);

		$ps_ids = array_unique(array_column($ventas, 'ps_id'));

		$ps_data = $ps->select('id_customer, newsletter')
			->from('ps_customer')
			->where_in('id_customer', $ps_ids)
			->get()
			->result_array();

		$ps_map = [];

		foreach ($ps_data as $cliente) {
			$ps_map[$cliente['id_customer']] = (int)$cliente['newsletter'];
		}

		$this->load->model('Email_model', 'Email');

		$secret = 'Dementito';

		$pendientes = [];

		foreach ($ventas as $venta) {

			// =========================
			// NEWSLETTER
			// =========================
			if (
				empty($ps_map[$venta['ps_id']]) ||
				$ps_map[$venta['ps_id']] != 1
			) {
				continue;
			}

			// =========================
			// ENCUESTA POR CANAL
			// =========================
			if (empty($encuestas_map[$venta['id_canal']])) {
				continue;
			}

			// =========================
			// BLOQUEO 30 DÍAS
			// =========================
			$encuesta_reciente = $this->db
				->select('id')
				->from('encuestas_enviadas')
				->where('id_cliente', $venta['id_cliente'])
				->where('fecha_envio >=', date('Y-m-d H:i:s', strtotime('-30 days')))
				->limit(1)
				->get()
				->row_array();

			if (!empty($encuesta_reciente)) {
				continue;
			}

			$id_encuesta = $encuestas_map[$venta['id_canal']];

			// =========================
			// HASH ÚNICO
			// =========================
			$hash_data =
				$venta['id'].'|'.
				$venta['id_canal'].'|'.
				$venta['id_punto_venta'].'|'.
				$venta['created'];

			$hash = hash_hmac('sha256', $hash_data, $secret);

			$venta['id_encuesta'] = $id_encuesta;
			$venta['hash'] = $hash;

			$pendientes[] = $venta;
		}

		if (empty($pendientes)) {

			echo 'No hay clientes válidos para encuesta.';
			return;
		}

		// =========================
		// TEST EMAIL SOLO HTML
		// =========================
		if ($confirmar === 'test_email') {

			$primer = $pendientes[0];

			$data = [
				'hash'  => $primer['hash'],
				'venta' => $primer
			];

			echo $this->load->view(
				'encuestas/satisfaccion_tienda',
				$data,
				true
			);

			return;
		}

		// =========================
		// PREVIEW
		// =========================
		if ((int)$confirmar !== 1) {

			echo '<h2>Modo preview - NO se enviará ni guardará nada</h2>';

			echo '<table border="1" cellpadding="5" cellspacing="0">';
			echo '<tr>
					<th>Nombre</th>
					<th>Email</th>
					<th>ID Venta</th>
					<th>ID Canal</th>
					<th>Hash</th>
				</tr>';

			foreach ($pendientes as $venta) {

				echo '<tr>';
				echo '<td>'.$venta['nombre'].'</td>';
				echo '<td>'.$venta['email'].'</td>';
				echo '<td>'.$venta['id'].'</td>';
				echo '<td>'.$venta['id_canal'].'</td>';
				echo '<td>'.$venta['hash'].'</td>';
				echo '</tr>';
			}

			echo '</table>';

			// Email de prueba
			$primer = $pendientes[0];

			$data = [
				'hash'  => $primer['hash'],
				'venta' => $primer
			];

			$subject = '[PRUEBA] ¿Cómo fue tu experiencia en DeMente Games?';

			$message = $this->load->view('encuestas/satisfaccion_tienda', $data, true);

			$result = $this->Email->send_email(
				'eduardo.vargasc@gmail.com',
				$subject,
				$message
			);

			echo '<br><br>';

			echo $result
				? 'Email de prueba enviado a eduardo.vargasc@gmail.com'
				: 'Error enviando email de prueba';

			return;
		}

		// =========================
		// ENVÍO REAL
		// =========================
		foreach ($pendientes as $venta) {

			$this->db->insert('encuestas_enviadas', [
				'id_encuesta'    => $venta['id_encuesta'],
				'id_venta'       => $venta['id'],
				'id_cliente'     => $venta['id_cliente'],
				'id_canal'       => $venta['id_canal'],
				'id_punto_venta' => $venta['id_punto_venta'],
				'email'          => $venta['email'],
				'hash'           => $venta['hash']
			]);

			$data = [
				'hash'  => $venta['hash'],
				'venta' => $venta
			];

			$subject = '¿Cómo fue tu experiencia en DeMente Games?';

			$message = $this->load->view('encuestas/satisfaccion_tienda', $data, true);

			$result = $this->Email->send_email(
				$venta['email'],
				$subject,
				$message
			);

			if ($result) {

				$now = date('Y-m-d H:i:s');

				$this->db->where('id', $venta['id'])->update('ventas', [
					'fecha_encuesta' => $now
				]);

				$this->db->where('id_venta', $venta['id'])->update('encuestas_enviadas', [
					'fecha_envio'      => $now,
					'fecha_expiracion' => date('Y-m-d H:i:s', strtotime('+7 days'))
				]);

				echo 'OK venta '.$venta['id'].'<br>';

			} else {

				log_message('error', 'Error enviando encuesta venta ID: '.$venta['id']);

				echo 'ERROR venta '.$venta['id'].'<br>';
			}
		}
	}


	public function enviar_giftcards_navidad() {
		// Cargar modelos dentro del método
		$this->load->model('Giftcard_model', 'Giftcard');
		$this->load->model('Email_model', 'Email');

		// Obtener giftcards navideñas pendientes (estado = 1, id_tipo = 2)
		$pendientes = $this->Giftcard->get_giftcards_pendientes_navidad();

		if (!$pendientes || count($pendientes) == 0) {
			echo "No hay giftcards navideñas pendientes\n";
			return;
		}

		foreach ($pendientes as $g) {

			$data['g'] = $g;
			$to = $g['email_destinatario'];
			$subject = 'Jo jo jo! Te han enviado una Giftcard!';

			// Clase según monto
			if ($g['monto'] == 20000) $data['gcClass'] = 'giftcard-20';
			elseif ($g['monto'] == 30000) $data['gcClass'] = 'giftcard-30';
			elseif ($g['monto'] == 50000) $data['gcClass'] = 'giftcard-50';
			elseif ($g['monto'] == 100000) $data['gcClass'] = 'giftcard-100';

			// Cargar vista del email
			$message = $this->load->view('giftcards/email_navidad_giftcard', $data , true);

			// Enviar correo
			$result = $this->Email->send_email($to, $subject, $message);

			if ($result == 1) {

				// Actualizar estado
				$gc['id'] = $g['id'];
				$gc['estado'] = 2;
				$gc['fecha_envio'] = date('Y-m-d H:i:s');

				$this->Giftcard->guardar($gc);

				echo "Giftcard ".$g['id']." enviada OK\n";
			}
			else {
				echo "Error al enviar giftcard ".$g['id']."\n";
			}
		}
	}

	public function cierre_dia_stock() {
		// Seguridad básica
		// if (!$this->input->is_cli_request()) return;

		$this->load->model('Stock_model', 'Stock');
		$this->load->model('Stock_snapshot_model', 'StockSnapshot');

		$fecha_cierre   = date('Y-m-d', strtotime('-1 day'));
		$fecha_snapshot = $fecha_cierre . ' 23:59:59';

		// Detectar posibles cambios
		$movimientos = $this->Stock
			->productos_con_movimiento($fecha_cierre);

		if (empty($movimientos)) {
			return;
		}

		foreach ($movimientos as $row) {

			$id_producto = $row['id_producto'];
			$id_almacen  = $row['id_almacen'];

			// Stock real al cierre
			$stock_actual = $this->Stock->get_stock_actual($id_producto, $id_almacen);

			// Último snapshot
			$ultimo = $this->StockSnapshot->get_ultimo_snapshot($id_producto, $id_almacen);

			// Guardar solo si cambió cualquier valor
			if (
				!$ultimo ||
				(int)$ultimo['stock'] !== (int)$stock_actual['stock'] ||
				(int)$ultimo['disponibles'] !== (int)$stock_actual['disponibles'] ||
				(int)$ultimo['reservados'] !== (int)$stock_actual['reservados'] ||
				(int)$ultimo['en_transito'] !== (int)$stock_actual['en_transito']
			) {
				$this->StockSnapshot->create([
					'id_producto'   => $id_producto,
					'id_almacen'    => $id_almacen,
					'fecha'         => $fecha_snapshot,
					'stock'         => $stock_actual['stock'],
					'disponibles'   => $stock_actual['disponibles'],
					'reservados'    => $stock_actual['reservados'],
					'en_transito'   => $stock_actual['en_transito'],
					'motivo'        => 'cierre_dia'
				]);
			}
		}
	}


	public function cierre_mes_stock() {
		$this->load->model('Stock_model', 'Stock');
		$this->load->model('Stock_snapshot_model', 'StockSnapshot');

		// Fecha del último día del mes anterior
		$fecha_cierre   = date('Y-m-d', strtotime('last day of previous month'));
		$fecha_snapshot = $fecha_cierre . ' 23:59:59';

		// Obtener todos los productos que tengan stock > 0
		$productos = $this->db
			->select('id_producto, id_almacen')
			->from('almacenes_productos')
			->where('stock >', 0)
			->get()
			->result_array();

		if (empty($productos)) {
			return;
		}

		foreach ($productos as $row) {

			$id_producto = $row['id_producto'];
			$id_almacen  = $row['id_almacen'];

			// Stock real al cierre
			$stock_actual = $this->Stock->get_stock_actual($id_producto, $id_almacen);

			// Guardar snapshot directamente
			$this->StockSnapshot->create([
				'id_producto'   => $id_producto,
				'id_almacen'    => $id_almacen,
				'fecha'         => $fecha_snapshot,
				'stock'         => $stock_actual['stock'],
				'disponibles'   => $stock_actual['disponibles'],
				'reservados'    => $stock_actual['reservados'],
				'en_transito'   => $stock_actual['en_transito'],
				'motivo'        => 'cierre_mes'
			]);
		}

		// --- Snapshot consolidado por producto ---
		$totales = $this->db
			->select('id_producto')
			->select_sum('stock', 'stock')
			->select_sum('disponibles', 'disponibles')
			->select_sum('reservados', 'reservados')
			->select_sum('en_transito', 'en_transito')
			->from('almacenes_productos')
			->where('stock >', 0)
			->group_by('id_producto')
			->get()
			->result_array();

		foreach ($totales as $total) {
			$this->StockSnapshot->create([
				'id_producto'   => $total['id_producto'],
				'id_almacen'    => 0, // indicamos que es consolidado general
				'fecha'         => $fecha_snapshot,
				'stock'         => $total['stock'],
				'disponibles'   => $total['disponibles'],
				'reservados'    => $total['reservados'],
				'en_transito'   => $total['en_transito'],
				'motivo'        => 'cierre_mes_general'
			]);
		}
	}
}