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

class Productos extends CI_Controller {

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

		$method = $this->router->fetch_method();
		if (!$this->Usuario->try()) {
			redirect('login');
		}

		$this->load->model('Categoria_model', 'Categoria', true);
	}

	/**
	 * Muestra listado de productos agrupados por proveedor
	 * En la parte superior existe un formulario para agregar un nuevo producto
	 */
	public function index() {
		//Se consultan productos ordenados por proveedor, nombre
		$data = [];
		$data = $this->Producto->get_globales($data);

		$data['productos'] = $this->Producto->get_all(true);
		$data['compras_proveedores'] = $this->Proveedor->total_compras();

		$data['view'] = 'productos/index';
		$data['title'] = 'Productos';

		$data['totales'] = $this->Producto->totales_proveedor($data['productos'], $data['compras_proveedores']);

		$data['content'] = $this->load->view('productos/index', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos
	 * Permite filtrar por estado (disponibilidad), proveedor, categoria, 
	 * En la parte superior existe un formulario para agregar un nuevo producto

	 * Campos: id - (imagen) Producto - Proveedor - Categoría - Comprados - Vendidos - Stock - Bodega - Tienda - Última venta - Acciones

	 */
	public function listado() {
		$data = [];
		// Traemos solo lo necesario
		$data['rankings'] = $this->Producto->list_rankings();

		$this->load->model('proveedor_model', 'Proveedor');
		$data['proveedores'] = $this->Proveedor->lista();
		$data['distribuidores'] = $this->Proveedor->lista(true);

		$this->load->model('categoria_model', 'Categoria');
		$data['categorias'] = $this->Categoria->list();

		$this->load->model('Almacen_model', 'Almacen', true);
		$data['info_productos'] = $this->Almacen->stock_productos();
		$data['almacenes_activos'] = $this->Almacen->lista(true);

		$this->load->model('marketplace_model');
		$data['marketplaces'] = $this->marketplace_model->lista_marketplaces();
		$data['marketplaces_detalles'] = $this->marketplace_model->get_marketplaces();

		$filtros = [];
		$orden = [];

		$data['categoria'] = $filtros['categoria'] = $this->input->get('categoria') ?? -1;
		$data['proveedor'] = $filtros['proveedor'] = $this->input->get('proveedor') ?? 0;
		$data['estado'] = $filtros['estado'] = $this->input->get('estado') ?? 0;

		$data['filtrosCategorias'] = ['-1' => 'Seleccionar', '0' => 'Todas'];
        $data['filtrosCategorias'] += $data['categorias'];

		$data['productos'] = $this->Producto->listado($filtros, $orden);

		$data['estados'] = [
			1 => 'Disponible',
			2 => 'Preventa',
			3 => 'Agotado'
		];

		$data['title'] = 'Productos';
		$data['content'] = $this->load->view('productos/listado', $data , true);
		$this->load->view('default', $data);
	}

	public function detalle_old($id) {
		$link = base_url('productos/detalle/' . $id);
		$this->load->model('Notificacion_model');
		$this->Notificacion_model->marcar_leidas_por_link($link);

		$this->Producto->actualiza_stocks($id);
		$data['producto'] = $this->Producto->full_info($id);

		//prx($data);
		$data['title'] = $data['producto']['nombre'];

		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);
		$data['canales_abr'] = $this->Venta->canales_abr($data);

		$data['tipos_compras'] = $this->Compra->list_tipos();

		$data['almacenes_listado'] = $this->Almacen->listado_stock();

		$data['estadosTraspasos'] = [
			0 => 'Borrador',
			1 => 'Solicitado',
			2 => 'En Preparación',
			3 => 'Preparado',
			4 => 'Completado',
			5 => 'Cancelado'
		];

		$data['content'] = $this->load->view('productos/detalle', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra información de un producto
	 * Cambia a mostrar resumen de un producto
	 */
	public function detalle($id) {
		$link = base_url('productos/detalle/' . $id);
		$this->load->model('Notificacion_model');
		$this->Notificacion_model->marcar_leidas_por_link($link);
		$this->Producto->actualiza_stocks($id);

		$data['producto'] = $this->Producto->resumen($id);

		// Margen (solo para ciertos perfiles)
		$data['producto']['margen'] = null;

		if (
			in_array($_SESSION['usuario']['perfil'], [1, 2]) &&
			!empty($data['producto']['ps_price']['precio']) &&
			!empty($data['producto']['costo_bruto'])
		) {
			$precio = $data['producto']['ps_price']['precio'];
			$costo = $data['producto']['costo_bruto'];

			$data['producto']['margen'] = round((($precio - $costo) / $precio) * 100, 2);
		}

		$data['rankings'] = $this->Producto->list_rankings();
		$this->load->model('Almacen_model', 'Almacen', true);
		$data['almacenes_listado'] = $this->Almacen->listado_stock();
		$data['almacenes_activos'] = $this->Almacen->lista(true);
		$data['ubicaciones'] = $this->Almacen->ubicaciones();

		$data['proveedores'] = $this->Proveedor->lista();
		$data['distribuidores'] = $this->Proveedor->lista(true);
		$data['categorias'] = $this->Categoria->list();

		$this->load->model('Marketplace_model', 'Marketplace', true);
		$data['marketplaces'] = $this->Marketplace->lista_marketplaces();

		$data['canales_abr'] = $this->Venta->canales_abr($data);

		$data['content'] = $this->load->view('productos/resumen', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Entrega ventas de un producto filtradas por canal y transportista, paginadas de a 100
	 * TO DO: Calcular total de vendidos y montos
	 */
	public function detalle_ventas($id, $condicion = 'vendidos') {
		$filtros = array_filter([
			'id_canal'         => $this->input->get('id_canal'),
			'id_transportista' => $this->input->get('id_transportista')
		]);

		$parametros = $filtros ? '?' . http_build_query($filtros) : '';

		if ($condicion == 'vendidos') {
			$data['titulo_condicion'] = 'Ventas';
			$filtros['vendido'] = 1;
			$filtros['id_tipo_venta'] = [1, 6];
		}
		else if ($condicion == 'en_espera') {
			$data['titulo_condicion'] = 'Ventas en Espera';
			$filtros['vendido'] = 0;
			$filtros['reservado'] = 1;
			$filtros['id_tipo_venta'] = [1, 6];
		}
		else if ($condicion == 'otras') {
			$data['titulo_condicion'] = 'Otras Ventas';
			$filtros['vendido'] = 0;
			$filtros['reservado'] = 0;
			$filtros['id_tipo_venta'] = [1, 6];
		}
		else if ($condicion == 'devoluciones') {
			$data['titulo_condicion'] = 'Devoluciones a Proveedor';
			$filtros['vendido'] = 0;
			$filtros['id_tipo_venta'] = [3];
		}
		else if ($condicion == 'mermas') {
			$data['titulo_condicion'] = 'Mermas';
			$filtros['id_tipo_venta'] = [4];
		}
		else {
			$data['titulo_condicion'] = 'Todas las Ventas';
			$filtros['id_tipo_venta'] = [1, 6];
		}

		$data['producto'] = $this->Producto->get_basico($id);
		$data = $this->Venta->get_globales_min($data);

		$filtros['cantidad'] = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$filtros['offset'] = ($pagina - 1) * $filtros['cantidad'];

		$result = $this->Producto->detalle_ventas($id, $filtros);
		$data = array_merge($data, $result);

		$url = base_url() . 'productos/detalle_ventas/' . $id;
		if ($condicion != 'vendidos') $url .= '/' . $condicion;

		$data['paginacion'] = paginacion(['url' => $url, 'parametros' => $parametros, 'total' => $data['total'], 'pagina' => $pagina, 'cantidad' => $filtros['cantidad']]);

		$data['content'] = $this->load->view('productos/detalle_ventas', $data , true);
		$this->load->view('default', $data);
	}


	/**
	 * Entrega traspasos de un producto filtradas por origen y destino, paginados de a 100
	 * TO DO: Ojito para ver traspasos NO para editar
	 */
	public function detalle_traspasos($id) {
		$filtros = array_filter([
			'id_origen'  => $this->input->get('id_origen'),
			'id_destino' => $this->input->get('id_destino')
		]);

		$parametros = $filtros ? '?' . http_build_query($filtros) : '';

		$data['producto'] = $this->Producto->get_basico($id);

		$filtros['cantidad'] = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$filtros['offset'] = ($pagina - 1) * $filtros['cantidad'];

		$result = $this->Producto->traspasos($id, $filtros);
		$data = array_merge($data, $result);

		$data['paginacion'] = paginacion(['url' => base_url().'productos/detalle_traspasos/'.$id, 'parametros' => $parametros, 'total' => $data['total'], 'pagina' => $pagina, 'cantidad' => $filtros['cantidad']]);

		$data['almacenes'] = $this->Almacen->lista(FALSE);

		$data['almacenes_listado'] = $this->Almacen->listado_stock();
		$data['estadosTraspasos'] = [
			0 => 'Borrador',
			1 => 'Solicitado',
			2 => 'En Preparación',
			3 => 'Preparado',
			4 => 'Completado',
			5 => 'Cancelado'
		];

		$data['content'] = $this->load->view('productos/detalle_traspasos', $data , true);
		$this->load->view('default', $data);
	}


	/**
	 * Entrega inventarios de un producto filtradas por almacen, paginados de a 100
	 */
	public function detalle_inventarios($id) {
		$filtros = array_filter([
			'id_almacen'  => $this->input->get('id_almacen'),
		]);

		$parametros = $filtros ? '?' . http_build_query($filtros) : '';

		$data['producto'] = $this->Producto->get_basico($id);

		$filtros['cantidad'] = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$filtros['offset'] = ($pagina - 1) * $filtros['cantidad'];

		$result = $this->Producto->inventarios($id, $filtros);
		$data = array_merge($data, $result);

		$data['paginacion'] = paginacion(['url' => base_url().'productos/detalle_inventarios/'.$id, 'parametros' => $parametros, 'total' => $data['total'], 'pagina' => $pagina, 'cantidad' => $filtros['cantidad']]);

		$data['almacenes'] = $this->Almacen->lista(FALSE);
		$data['usuarios'] = $this->Usuario->lista(0);

		$data['almacenes_listado'] = $this->Almacen->listado_stock();
		$data['estadosTraspasos'] = [
			0 => 'Borrador',
			1 => 'Solicitado',
			2 => 'En Preparación',
			3 => 'Preparado',
			4 => 'Completado',
			5 => 'Cancelado'
		];

		$data['content'] = $this->load->view('productos/detalle_inventarios', $data , true);
		$this->load->view('default', $data);
	}


	/**
	 * Entrega compras paginadas y filtradas por tipo
	 */
	public function detalle_compras($id) {
		$data['producto'] = $this->Producto->get_basico($id);

		$filtros['cantidad'] = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$filtros['offset'] = ($pagina - 1) * $filtros['cantidad'];

		$result = $this->Producto->compras($id, $filtros);
		$data = array_merge($data, $result);

		$data['proveedores'] = $this->Proveedor->lista();
		$data['proveedoresNombres'] = array_flip($data['proveedores']);
		$data['tipos_compras'] = $this->Compra->list_tipos();
		$data['categorias_compras'] = $this->Compra->list_categorias_compras();
		$data['almacenes'] = $this->Almacen->lista();

		$parametros = '?';
		$url = base_url() . 'productos/detalle_compras/' . $id;

		$data['paginacion'] = paginacion(['url' => $url, 'parametros' => $parametros, 'total' => $data['total'], 'pagina' => $pagina, 'cantidad' => $filtros['cantidad']]);

		$data['content'] = $this->load->view('productos/detalle_compras', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Entrega ventas PS paginadas
	 */
	public function detalle_ventas_ps($id) {
		$data['producto'] = $this->Producto->get_basico($id);

		$filtros['cantidad'] = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$filtros['offset'] = ($pagina - 1) * $filtros['cantidad'];

		$result = $this->Producto->ventas_ps($data['producto']['ps_id'], $filtros);
		$data = array_merge($data, $result);

		$parametros = '?';
		$url = base_url() . 'productos/detalle_ventas_ps/' . $id;

		$data['paginacion'] = paginacion(['url' => $url, 'parametros' => $parametros, 'total' => $data['total'], 'pagina' => $pagina, 'cantidad' => $filtros['cantidad']]);

		$data['content'] = $this->load->view('productos/detalle_ventas_ps', $data , true);
		$this->load->view('default', $data);
	}


	/**
	 * Cambios de precio del producto
	 */
	public function detalle_precios($id) {
		$data['producto'] = $this->Producto->get_basico($id);

		$filtros['cantidad'] = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$filtros['offset'] = ($pagina - 1) * $filtros['cantidad'];

		$result = $this->Producto->precios($id, $filtros);
		$data = array_merge($data, $result);

		$parametros = '?';
		$url = base_url() . 'productos/detalle_precios/' . $id;

		$data['paginacion'] = paginacion(['url' => $url, 'parametros' => $parametros, 'total' => $data['total'], 'pagina' => $pagina, 'cantidad' => $filtros['cantidad']]);

		$data['content'] = $this->load->view('productos/detalle_precios', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra suscritos al producto
	 */
	public function detalle_suscritos($id) {
		$data['producto'] = $this->Producto->get_basico($id);

		$filtros['cantidad'] = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$filtros['offset'] = ($pagina - 1) * $filtros['cantidad'];

		$result = $this->Producto->suscritos($data['producto']['ps_id'], $filtros);
		$data = array_merge($data, $result);

		$parametros = '?';
		$url = base_url() . 'productos/detalle_suscritos/' . $id;

		$data['paginacion'] = paginacion(['url' => $url, 'parametros' => $parametros, 'total' => $data['total'], 'pagina' => $pagina, 'cantidad' => $filtros['cantidad']]);

		$data['content'] = $this->load->view('productos/detalle_suscritos', $data , true);
		$this->load->view('default', $data);
	}


	/**
	 * Total de ventas diarias
	 */
	public function vendidos() {
		$parametros = '?';
		
		$data['t'] = $t = $_GET['t'] ?? 1;
		$data['c'] = $c = $_GET['c'] ?? 0;
		$data['m'] = $m = $_GET['m'] ?? date('Ym');
		$data['p'] = $p = $_GET['p'] ?? 0;
		$data['ct'] = $ct = $_GET['ct'] ?? 0;
		$parametros .= 't='.$t.'&c='.$c.'&m='.$m.'&p='.$p.'&ct='.$ct;

		$cantidad = 100;
		$pagina = $this->input->get('pagina') ?? 1;
		$offset = ($pagina - 1) * $cantidad;


		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['vendidos'] = $this->Producto->ventas($t, $m, $c, $p, $ct, $offset, $cantidad);

		$data['paginacion'] = paginacion(['url' => base_url().'productos/vendidos', 'parametros' => $parametros, 'total' => $data['vendidos']['total_registros'], 'pagina' => $pagina, 'cantidad' => $cantidad]);
		$data['pagina'] = $pagina;
		$data['cantidad'] = $cantidad;

		$data['meses_ventas'] = $this->Venta->get_meses_ventas();
		array_unshift($data['canales'], 'Todos');

		$data['almacenes_listado'] = $this->Almacen->listado_stock();

		$data['title'] = 'Productos';
		$data['content'] = $this->load->view('productos/vendidos', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra todos los productos que no tengan un id de prestashop asociado
	 */
	public function relation() {
		//Se consultan productos ordenados por proveedor, nombre
		$data = [];
		$data = $this->Producto->get_globales($data);
		$data['excluidos'] = $this->Producto->relation();
		$data['ps_news'] = $this->Producto->ps_news();

		$data['title'] = 'Productos';
		$data['content'] = $this->load->view('productos/relation', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Entrega un listado de los productos peor vendidos
	 */
	public function worst () {
		$data['productos'] = $this->Producto->worst();

		$data['title'] = 'Productos';
		$data['content'] = $this->load->view('productos/worst', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Entrega listado de productos con suscripciones a restock
	 */
	public function waiting() {
		$data['tipo'] = $t = $_GET['tipo'] ?? 0;

		if ($data['tipo'] == 0) {
			$waiting = $this->Producto->ps_waiting();
			$data['ps_productos'] = $waiting['products'];
			$data['total_alertas'] = $waiting['count'];
		}
		if ($data['tipo'] == 1) {
			$waiting = $this->Producto->ps_waiting(1);
			$data['alertas'] = $waiting['alertas'];
		}
			
		$data['title'] = 'Esperados';
		$data['content'] = $this->load->view('productos/waiting', $data , true);
		$this->load->view('default', $data);
	}

	/*
	 * Muestra stock de productos disponibles, separados por categoría y disponibles o agotados
	 */
	public function stock() {
		$busqueda = $this->input->post('busqueda');
		$data['productos'] = $this->Producto->stock($busqueda);
		$data['categorias'] = $this->Categoria->list();
		$data['title'] = 'Stock de Productos';
		$data['content'] = $this->load->view('productos/stock', $data , true);
		$this->load->view('public', $data);
	}

	/**
	 * Entrega listado de productos prevendidos ordenados Alfabéticamente
	 */
	public function presale() {
		$presale = $this->Producto->presale();
		$data['productos'] = $presale['productos'];
		$data['costos'] = $presale['costos'];
		$data['proveedores'] = $this->Proveedor->lista();
		$data['title'] = 'Productos en Preventa';
		$data['content'] = $this->load->view('productos/presale', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Entrega listado de fechas de preventas ascendente
	 */
	public function dates() {
		$data['productos'] = $this->Producto->ps_dates();
		$data['title'] = 'Preventa';
		$data['content'] = $this->load->view('productos/dates', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Permite asociar categorias de Dcto rapidamente a los productos
	 */
	public function discounts() {
		$data['categorias'] = $this->Producto->ps_categories(true);
		$data['productos'] = $this->Producto->ps_products($data['categorias']);
		$data['title'] = 'Descuentos';
		$data['content'] = $this->load->view('productos/discounts', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Permite identificar distintas anomalías en los productos
	 * Productos sin Video
	 * Productos sin Campo Disponibilidad
	 * Productos con fecha de llegada vencida o por vencer
	 * TO DO:	 
	 * Productos con descuadre de stock entre Ventas y PS
	 * Productos con categoría Preventa y Disponibilidad distinta a preventa y caso contrario
	 * 
	 */
	public function monitor($seccion = 'diferencias-stock') {
		$data['seccion'] = $seccion;
		$data = $this->Producto->get_globales($data);

		$data['productos'] = $this->Producto->ps_monitor($seccion);

		$data['almacenes_listado'] = $this->Almacen->listado_stock();

		$data['title'] = 'Monitor';
		$data['content'] = $this->load->view('productos/monitor', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos que se encuentran en el estado solicitado
	 */
	public function state($idEstado = 0) {
		// Si no se solicita estado se muestran tods los estados y el total
		$data['prevendidos'] = $this->Producto->get_by_state($idEstado);
		$data['idEstado'] = $idEstado;
		$data = $this->Venta->get_globales($data);

		$data['title'] = 'Productos por estado';
		$data['content'] = $this->load->view('productos/state', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos que se han agotado en el último mes
	 */
	public function agotados() {

		$data['p'] = $p = $_GET['p'] ?? 0;

		$data['agotados'] = $this->Producto->agotados($p);
		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['title'] = 'Productos agotados';
		$data['content'] = $this->load->view('productos/agotados', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos publicados en Mercado Libre y sin publicar que tengan stock
	 */
	public function resumen_market($idCanal) {
		$ini = $_GET['ini'] ?? date('Y-m-d', strtotime('-30 days', time()));
		$fin = $_GET['fin'] ?? date('Y-m-d');

		$data['market'] = $this->Producto->resumen_marketplace($idCanal, $ini, $fin);
		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['linkActivo']['section'] = nombre_mp($idCanal);
		$data['linkActivo']['activo'] = 'Resumen';

		$data['content'] = $this->load->view('productos/mp_resumen', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos publicados en Mercado Libre y sin publicar que tengan stock
	 */
	public function marketplace($idCanal) {
		$data['estado'] = isset($_GET['estado']) ? $_GET['estado'] : 1;
		$data['stock'] = isset($_GET['stock']) ? $_GET['stock'] : 1;
		$data['categoria'] = $_GET['categoria'] ?? 0;
		$data['proveedor'] = $_GET['proveedor'] ?? 0;

		$filtros = $data;
		
		$data['rows'] = $this->Producto->marketplace($idCanal, $filtros);

		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['linkActivo']['section'] = nombre_mp($idCanal);
		$data['linkActivo']['activo'] = 'Productos';

		$data['content'] = $this->load->view('productos/marketplace', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos de MP con sobrestock o sin stock
	 */
	public function mp_problemas($idCanal) {
		$data['rows'] = $this->Producto->mp_problemas($idCanal);

		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['linkActivo']['section'] = nombre_mp($idCanal);
		$data['linkActivo']['activo'] = 'Problemas';

		$data['content'] = $this->load->view('productos/mp_problemas', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos ordenados por Ranking mostrando sus principales caracteristicas
	 */
	public function rankings() {

		$data['productos_rankings'] = $this->Producto->productos_rankings();

		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['cabeceras'] = [
			'ps_id' => ['nombre' => 'PS', 'class'=>'text-center'],
			'nombre' => ['nombre' => 'Nombre', 'class'=>''],
			'disponibles' => ['nombre' => 'Disponibles', 'class'=>'text-center'],
			'ultima_venta' => ['nombre' => 'Última Venta', 'class'=>'text-center', 'type' => 'fecha'],
			'ultima_compra' => ['nombre' => 'Última Compra', 'class'=>'text-center', 'type' => 'fecha'],
			'fecha_ranking' => ['nombre' => 'Fecha Ranking', 'class'=>'text-center', 'type' => 'fecha'],
			'sin_venta' => ['nombre' => 'Días Sin Venta', 'class'=>'text-center'],
			'dias_ranking' => ['nombre' => 'Días En Ranking', 'class'=>'text-center'],
			'acciones' => ['nombre'=> 'Acciones', 'class' => 'text-center']
		];

		$data['content'] = $this->load->view('productos/rankings', $data , true);
		$this->load->view('default', $data);
	}

	public function diferencias() {
		$data['diferencias'] = $this->Producto->diffs(true);
		$data['codigos_repetidos'] = $this->Producto->codigos_repetidos();
		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['title'] = 'Diferencia de Stock';
		$data['content'] = $this->load->view('productos/diferencias', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Entrega un listado de productos con poco stock para el periodo siguiente
	 */
	public function sugerencias() {
		$data['periodo'] = $this->input->get('periodo') ?? 30;
		$data['categoria'] = $this->input->get('categoria') ?? 0;
		$data['proveedor'] = $this->input->get('proveedor') ?? 0;
		if (isset($_GET['ranking'])) {
			$data['ranking'] = $_GET['ranking'];
		}
		else {
			$data['ranking'] = '-1';
		}

		if ($data['ranking'] == '-1'){
			$filtro['ranking'] = [0,1,2,3];
		}
		else {
			$filtro['ranking'] = explode(',', $data['ranking']);
		}

		$data['sugeridos'] = $this->Producto->sugerencias($data['periodo'], $data['categoria'], $data['proveedor'], $filtro['ranking']);
		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['title'] = 'Sugerencias de compra';
		$data['titulo'] = 'Productos segeridos para compra';

		$data['content'] = $this->load->view('productos/sugerencias', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Entrega listado de productos mostrando su codigo de barras y un input para agregar rápidamente
	 */
	public function codigos() {
		$filtros = [];
		$filtros['cantidad'] = $_GET['cantidad'] ?? 50;
		$filtros['codigo'] = $_GET['codigo'] ?? 0;
		$filtros['existencia'] = $_GET['existencia'] ?? 1;
		$filtros['proveedor'] = $_GET['proveedor'] ?? 0;
		$filtros['categoria'] = $_GET['categoria'] ?? 0;
		$filtros['busqueda'] = $_GET['busqueda'] ?? '';

		$data['filtros'] = $filtros;

		$data = $this->Venta->get_globales($data);
		$data = $this->Producto->get_globales($data);

		$data['resultados'] = $this->Producto->codigos($filtros);

		array_unshift($data['canales'], 'Todos');

		$data['title'] = 'Códigos de Barra';
		$data['content'] = $this->load->view('productos/codigos', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Permite generar un listado de códigos para imprimir
	 */
	public function impresion() {
		$data = [];
		$data = $this->Producto->get_globales($data);
		$data['info_productos'] = $this->Producto->list_info();

		$data['title'] = 'Imprimir Precios y Códigos de Barra';
		$data['content'] = $this->load->view('productos/listado_impresion', $data , true);
		$this->load->view('default', $data);
	}

	public function codigo_barra($text) {
		////$filepath="", $text="0", $size="20", $orientation="horizontal", $code_type="code128", $print=false, $SizeFactor=1
		$params = [
			'text' => $text,
			'size' => 100,
			'print' => true,
			'codeType' => 'codabar'
		];

		barcode($params);
	}


	/**
	 * Recibe ids de vdm separados por guion, idealmente de a 3
	 */
	public function imprimir_codigos($ids) {
		$ids = explode('-', $ids);
		$data['codigos'] = $this->Producto->datos_codigos($ids);
		$this->load->view('productos/imprimir_codigos', $data);
	}

	/**
	 * Recibe ids de vdm separados por guion, idealmente de a 3
	 */
	public function imprimir_precios($ids) {
		$ids = explode('-', $ids);
		$data['precios'] = $this->Producto->datos_precios($ids);
		$this->load->view('productos/imprimir_precios', $data);
	}

	public function categorias_ps($idCategoria = 0) {
		$data = [];
		$data = $this->Producto->get_globales($data);
		// Si no viene id de categoría se muestra el listado de todas las categorías de PS
		// Ordenados por jerarquía
		if ($idCategoria == 0) {
			$data['categorias_ps'] = $this->Producto->categorias_ps();
			$data['title'] = 'Categorías Prestashop';
			$data['content'] = $this->load->view('productos/categorias_ps', $data , true);
		}

		// Si viene id de categoría se muestran todos los productos de la categoría
		if ($idCategoria > 0) {
			$data['categoria_ps'] = $this->Producto->productos_ps($idCategoria);
			$data['title'] = 'Productos de Categoría: ' . $data['categoria_ps']['name'];
			$data['content'] = $this->load->view('productos/productos_ps', $data , true);
		}

		//prx($data);

		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de productos con cambio de precio en los últimos 7 días
	 */
	public function cambio_precios(){
		$data = [];
		$resultados = $this->Producto->log_cambio_precio();

		foreach($resultados as $p) {
			$data['resultados'][fecha($p['fecha_cambio'])][] = $p;
		}

		$data['content'] = $this->load->view('productos/cambio_precio', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Muestra listado de cambios que ha sufrido un producto en toda su historia
	 */
	public function cambios($idProducto) {
		$data['log'] = $this->Producto->get_log($idProducto);
		$data['usuarios'] = $this->Usuario->lista();
		$this->load->model('almacen_model', 'Almacen', true);
		$data['almacenes'] = $this->Almacen->lista();
		$this->load->view('productos/cambios', $data);
	}

	public function reporte_ventas() {
		// Solo visible para administradores y supervisores
		if (!in_array($_SESSION['usuario']['perfil'], [1, 2, 3])) {
			rediredirect('/ventas/tienda', 'refresh');
		}

		$fecha_inicio = $this->input->get_post('inicio');
		$fecha_fin    = $this->input->get_post('fin');
		$id_canal     = $this->input->get_post('canal');

		$hoy = date('Y-m-d');

		// 1) No recibe ninguna fecha → usar hoy
		if (empty($fecha_inicio) && empty($fecha_fin)) {
			$fecha_inicio = $hoy;
			$fecha_fin    = $hoy;
		}
		// 2) Recibe solo fecha_inicio
		elseif (!empty($fecha_inicio) && empty($fecha_fin)) {
			if ($fecha_inicio <= $hoy) {
				$fecha_fin = $hoy;    // Si es menor o igual a hoy → fin = hoy
			} else {
				$fecha_fin = $fecha_inicio; // Si es mayor a hoy → misma fecha
			}
		}
		// 3) Recibe solo fecha_fin → inicio = fin
		elseif (empty($fecha_inicio) && !empty($fecha_fin)) {
			$fecha_inicio = $fecha_fin;
		}

		// Validación de rango máximo de 31 días
		$inicio = new DateTime($fecha_inicio);
		$fin    = new DateTime($fecha_fin);
		$diferencia = $inicio->diff($fin)->days;

		if ($diferencia > 31) {
			// Forzamos fecha_fin a 31 días después del inicio
			$fin = clone $inicio;
			$fin->modify('+31 days');
			$fecha_fin = $fin->format('Y-m-d');

			// (Opcional) Mensaje de advertencia
			$data['flashdata'] = ['warning', 'El rango de fechas fue ajustado automáticamente al máximo permitido (31 días).'];
		}

		// Canal: si no envían → todos
		if (empty($id_canal)) {
			$id_canal = null;
		}

		// Llamar al modelo
		$data['ventas'] = $this->Producto->getVentasDetalladas($fecha_inicio, $fecha_fin, $id_canal);

		// Listado de canales para select
		$data['canales'] = $this->Venta->get_canales();

		// Mantener valores en vista
		$data['fecha_inicio'] = $fecha_inicio;
		$data['fecha_fin']    = $fecha_fin;
		$data['id_canal']     = $id_canal;

		$data['content'] = $this->load->view('productos/reporte_ventas', $data , true);
		$this->load->view('default', $data);
	}


	public function exportar_rv_csv() {
		$fecha_inicio = $this->input->post('fecha_inicio');
		$fecha_fin    = $this->input->post('fecha_fin');
		$id_canal     = $this->input->post('id_canal');

		$ventas = $this->Producto->getVentasDetalladas($fecha_inicio, $fecha_fin, $id_canal);

		// Nombre dinámico del archivo
		$filename = 'reporte_ventas_' . date('Ymd_His') . '.csv';

		header('Content-Type: text/csv; charset=utf-8');
		header('Content-Disposition: attachment; filename=' . $filename);

		$output = fopen('php://output', 'w');

		// Encabezados del CSV
		fputcsv($output, [
			'ID Venta', 'Fecha Venta', 'Hora Venta', 'Tipo Documento',
			'Número Documento', 'Producto', 'Categoría', 'Cantidad',
			'Precio', 'Descuento', 'Total Producto', 'Canal'
		]);

		// Datos
		 foreach ($ventas as $v) {
			fputcsv($output, [
				$v->id_venta,
				fecha($v->fecha),   // mismo helper que usaste en la vista
				$v->hora,
				$v->tipo_documento,
				$v->numero_boleta,
				$v->producto,
				$v->categoria,
				$v->cantidad,
				$v->precio,         // sin formato para que Excel lo lea bien
				$v->descuento,
				$v->precio_total,
				$v->canal
			]);
		}

		fclose($output);
		exit;
	}


	public function quiebres() {
		// =========================
		// 1. Recuperar filtros GET
		// =========================

		$filtros = [];

		$get = function($key, $type = null) {
			$v = $this->input->get($key);
			if ($v === null || $v === '') return null;
			return $type === 'int' ? (int)$v : $v;
		};

		$filtros['periodo'] = $get('periodo');
		$filtros['id_almacen'] = isset($_GET['id_almacen']) ? (int)$_GET['id_almacen'] : '-1';
		$filtros['id_proveedor'] = $get('id_proveedor', 'int');
		$filtros['tipo'] = $get('tipo');
		$filtros['reposicion'] = isset($_GET['reposicion']) ? (int)$_GET['reposicion'] : 1;
		$filtros['estado'] = isset($_GET['estado']) ? (int)$_GET['estado'] : 0;

		$filtros['fecha_desde'] = $get('fecha_desde');
		$filtros['fecha_hasta'] = $get('fecha_hasta');

		// =========================
		// 2. Defaults si no vienen fechas
		// (ej: este mes)
		// =========================

		if (!$filtros['fecha_desde'] || !$filtros['fecha_hasta']) {
			$filtros['fecha_desde'] = date('Y-m-01');
			$filtros['fecha_hasta'] = date('Y-m-t');
		}

		$data['filtros'] = $filtros;

		// =========================
		// 3. Datos para la vista
		// =========================

		$data = $this->Producto->get_globales($data);

		// Meses con ventas según filtros (para el select)
		$data['meses_ventas'] = $this->Venta->get_meses_ventas();

		// Almacenes / tiendas
		$this->load->model('almacen_model', 'Almacen');
		$data['tiendas'] = $this->Almacen->tiendas();
		$data['almacenes_listado'] = $this->Almacen->listado_stock();

		// Proveedores
		$this->load->model('proveedor_model', 'Proveedor');
		$data['distribuidores'] = $this->Proveedor->lista(1);

		$this->load->model('quiebre_model', 'Quiebre');
		$data['resoluciones_quiebres'] = $this->Quiebre->resoluciones_quiebres();
		$data['resoluciones_quiebres_opciones'] = $this->Quiebre->resoluciones_quiebres(TRUE);


		// =========================
		// 4. Llamada al modelo
		// =========================
		$data['quiebres'] = $this->Quiebre->quiebres($filtros);

		// =========================
		// 5. Render
		// =========================

		$data['title'] = 'Quiebres';
		$data['content'] = $this->load->view('productos/quiebres', $data, true);
		$this->load->view('default', $data);
	}


/********************************************* Funciones JSON **********************************************/

	/*
	 * Entrega información del producto por id
	 */
	public function get() {
		if ($this->input->post_get('id')) {
			$result = $this->Producto->get($this->input->post('id'));
		}
		else {
			$result['error'] = TRUE;
		}

		echo json_encode($result);
	}

	public function get_basico() {
		$id = $this->input->post_get('id');

		if ($id) {
			$producto = $this->Producto->get_basico($id);

			if (!empty($producto)) {
				// Si encontró el producto
				$result = [
					'success' => true,
					'data' => $producto
				];
			} else {
				// Si no encontró nada
				$result = [
					'success' => false,
					'message' => 'Producto no encontrado'
				];
			}
		} else {
			$result = [
				'success' => false,
				'message' => 'Parámetro ID faltante'
			];
		}

		echo json_encode($result);
	}

	/**
	 * Busca si un código de barra existe
	 */
	public function buscaCodigo(){
		$codigo = $this->input->post_get('codigo');

		if ($codigo) {
			$producto = $this->Producto->get_by_codigo($codigo); // tu consulta al modelo

			if ($producto) {
				echo json_encode([
					'success' => true,
					'data' => $producto
				]);
			} else {
				echo json_encode([
					'success' => false,
					'message' => 'Código no encontrado'
				]);
			}
		} else {
			echo json_encode([
				'success' => false,
				'message' => 'Código vacío'
			]);
		}
	}

	/**
	 * Entrega la info de un producto de Prestashop
	 */
	public function get_ps() {
		if (!empty($this->input->post('id'))) {
			$result = $this->Producto->get_ps($this->input->post('id'));
		}
		else if(!empty($this->input->get('id'))) {
			$result = $this->Producto->get_ps($this->input->get('id'));
		}
		else {
			$result['error'] = TRUE;
		}
		echo json_encode($result);
	}

	public function save() {
		if (!empty($_POST)) {
			$result = $this->Producto->save($_POST);
			header('Content-type: application/json');
			echo json_encode($result);
		}
	}

	/**
	 * Elimina un producto de la lista, llevandolo a deleted 1
	 * se mantienen todas sus compras y ventas
	 */
	public function delete() {
		if ($this->input->post('id')) {
			$result = $this->Producto->delete($this->input->post('id'));
			return true;
			die;
		}
		return false;
	}

	/**
	 * Entrega la info de un producto de Prestashop
	 */
	public function get_ps_image($id = 0) {

		//Se revisa si se está creando una venta
		if (!empty($this->input->post('id'))) {
			$id = $this->input->post('id');
		}
		$ps_id = $this->Producto->get_ps_id($id);
		$result = ['id_image' => $this->Producto->get_ps_image($ps_id)];
		echo json_encode($result);
	}

	/**
	 * Entrega la imagen y costo neto de un producto
	 */
	public function datos_para_compra($id = 0) {

		//Se revisa si se está creando una venta
		if (!empty($this->input->post('id'))) {
			$id = $this->input->post('id');
		}
		$ps_id = $this->Producto->get_ps_id($id);
		$result['id_image'] = $this->Producto->get_ps_image($ps_id);
		$result['costo_neto'] = $this->Producto->get_costo_neto($id);

		echo json_encode($result);
	}

	
	public function guarda_codigo(){
		$result = $this->Producto->guarda_codigo($_POST);
		header('Content-type: application/json');
		echo json_encode($result);
	}

	/**
	 * Recibe un id de producto y entrega un código de barra en base a su proveedor y id de VDM
	 */
	public function genera_ean13($id) {
		$producto = $this->Producto->get($id);
		$result = ['status' => 'error', 'codigo' => ''];
		

		if(!empty($producto)) {
			$codigo = 200000000000 + ($producto['id_proveedor'] * 100000) + $producto['id'];
			$dv = dv_ean13($codigo);

			$result = [
				'status' => 'success',
				'codigo' => $codigo . $dv
			];
		}

		header('Content-type: application/json');
		echo json_encode($result);
	}


	public function agregar_categoria() {
		if (!empty($_POST)) {
			$result['producto'] = $this->Producto->agregar_categoria($_POST);
			header('Content-type: application/json');
			echo json_encode($result);
		}
	}

	public function remover_categoria() {
		if (!empty($_POST)) {
			$result = $this->Producto->remover_categoria($_POST);
			header('Content-type: application/json');
			echo json_encode($result);
		}
	}

	public function quita_preventa() {
		if (!empty($_POST)) {
			$result = $this->Producto->quita_preventa($_POST['id']);
			header('Content-type: application/json');
			echo json_encode($result);
		}
	}

	/*
	 * Entrega información de stock en los distintos almacenes
	 */
	public function get_stock() {
		if ($this->input->post_get('id')) {
			$result['almacenes'] = $this->Producto->stock_almacenes($this->input->post('id'));
		}
		else {
			$result['error'] = TRUE;
		}

		echo json_encode($result);
	}

	public function save_stock() {
		if (!empty($_POST)) {
			$result = $this->Producto->save_stock($_POST);
			header('Content-type: application/json');
			echo json_encode($result);
		}
	}


	public function get_stock_producto()	{
		$idProducto = $this->input->post('id_producto');
		$idTransportista = $this->input->post('id_transportista');

		if (!$idProducto) {
			echo json_encode(['success' => false]);
			return;
		}

		if (!$idTransportista) {
			$idTransportista = 2;
		}

		// Obtén el id del almacén asociado al transportista
		$transportista = $this->db
			->select('id_almacen')
			->where('id', $idTransportista)
			->get('transportistas')
			->row_array();

		if (!$transportista) {
			echo json_encode(['success' => false]);
			return;
		}

		$idAlmacen = $transportista['id_almacen'];

		// Stock general
		$stockGeneral = 0;

		// Stock por almacén (para tooltip)
		$rows = $this->db
			->select('id_almacen, disponibles')
			->where('id_producto', $idProducto)
			->get('almacenes_productos')
			->result_array();

		$stocksPorAlmacen = [];
		$stockAlmacen = 0;
		foreach ($rows as $row) {
			$stocksPorAlmacen[$row['id_almacen']] = $row['disponibles'];
			$stockGeneral += $row['disponibles'];
			if($row['id_almacen'] == $idAlmacen) {
				$stockAlmacen = $row['disponibles'];
			}
		}

		echo json_encode([
			'success' => true,
			'data' => [
				'stock_general' => $stockGeneral,
				'stock_almacen' => $stockAlmacen,
				'stocks_por_almacen' => $stocksPorAlmacen
			]
		]);
	}


	public function resolver_quiebre() {
		$id_quiebre = $_POST['id_quiebre'] ?? 0;
		$id_resolucion = $_POST['id_resolucion'] ?? 0;

		if(!$id_quiebre || !$id_resolucion){
			header('Content-type: application/json');
			echo json_encode(['ok' => false]);
			return;
		}

		$this->load->model('Quiebre_model', 'Quiebre');

		$resultado = $this->Quiebre->resolver_quiebre(
			$id_quiebre,
			$id_resolucion
		);

		header('Content-type: application/json');

		if($resultado){
			echo json_encode([
				'ok' => true,
				'fecha' => date('Y-m-d H:i:s')
			]);
		} else {
			echo json_encode(['ok' => false]);
		}
	}


	public function reabrir_quiebre() {
		$id_quiebre = $_POST['id_quiebre'] ?? 0;

		if(!$id_quiebre){
			header('Content-type: application/json');
			echo json_encode(['ok' => false]);
			return;
		}

		$this->load->model('Quiebre_model','Quiebre');

		$resultado = $this->Quiebre->reabrir_quiebre($id_quiebre);

		header('Content-type: application/json');

		echo json_encode([
			'ok' => $resultado ? true : false
		]);
	}

/************************* Funciones secretas para actualización de datos ****************/
	/**
	 * Entrega lista de productos para autocomplete
	 */
	public function ac_nombre() {
		$s = $_GET['term'];

		$r = $this->Producto->autocomplete_nombre($s);

		echo $_GET['callback']. '(' . json_encode($r) .');';
		die;
	}

	/**
	 * Entrega lista de productos PS para autocomplete
	 */
	public function acps_nombre() {
		$s = $_GET['term'];

		$r = $this->Producto->autocomplete_nombre_ps($s);

		echo $_GET['callback']. '(' . json_encode($r) .');';
		die;
	}


	/**
	 * Relaciona productos a Prestashop según su nombre idéntico
	 */

	public function autorelation() {
		$data['ps_productos'] = $this->Producto->ps_relation();
		die;
	}

	/**
	 * Actualiza fechas de compra y venta de productos
	 */
	public function update_dates () {
		$data['productos'] = $this->Producto->update_dates();
		pr($data);
		die;
	}

	/**
	 * Actualiza estados de stock, reservados, disponibles y vendidos, según estado actual de la venta
	 */
	public function recontar ($id = 0) {
		$this->Venta->update_states($id);
		$data['productos'] = $this->Producto->ajusta_stock($id);
		$data['fechas'] = $this->Producto->update_dates($id);
		prx($data);
	}

	/**
	 * Actualiza nombres de prodcutos desded Prestashop
	 */
	public function update_nombres () {
		$data = $this->Producto->update_names();
		prx($data);
	}
}
