<?php
class Proveedor_model extends CI_Model {

	public function lista($distribuidor = false) {
		$this->db->select('id, nombre');
		$this->db->from('proveedores');
		if (!empty($distribuidor)) {
			$this->db->where('distribuidor', 1);
		}
		$this->db->where('deleted', 0);
		$this->db->order_by('nombre', 'ASC');
		$query = $this->db->get();

		$proveedores = $query->result_array();

		$r = [];
		foreach ($proveedores as $p) {
			$r[$p['id']] = $p['nombre'];
		}

		return $r;
	}

	public function get($id) {
		$this->db->from('proveedores p');
		$this->db->where('p.id', $id);
		$this->db->where('p.deleted', 0);
		$query = $this->db->get();
		$proveedor = $query->row_array();
		
		if (!empty($proveedor)) {
			return $proveedor;
		}
		else{
			return [];
		}
	}

	public function get_all() {
		$this->db->select('*');
		$this->db->from('proveedores p');
		$this->db->where('p.deleted', 0);
		$this->db->order_by('p.nombre', 'ASC');
		$query = $this->db->get();

		return $query->result_array();
	}

	public function save($data) {
		//revisar si viene id y si viene se hace update
		if (empty($data['id'])) {
			$data['created'] = date('Y-m-d H:i:s');
			$this->db->insert('proveedores', $data);
			return $this->db->insert_id();
		}
		else {
			$this->db->where('id', $data['id']);
			$this->db->update('proveedores', $data);
			return $data['id'];
		}
	}

	public function delete($id) {
		//revisar si viene id y si viene se hace update
		if (!empty($id)) {
			$this->db->set('deleted', 1, FALSE);
			$this->db->where('id', $id);
			$this->db->update('proveedores');
		}
	}

	public function total_compras() {
		$this->db->select('id_proveedor, SUM(total) as total');
		$this->db->from('compras c');
		$this->db->where('c.deleted', 0);
		$this->db->group_by('c.id_proveedor');
		$this->db->order_by('c.id_proveedor', 'ASC');
		$total_compras = $this->db->get()->result_array();

		foreach ($total_compras as $tc) {
			$return[$tc['id_proveedor']] = $tc['total'];
		}

		return $return;
	}

	public function search($b = '') {
		$this->db->select('p.*');
		$this->db->from('proveedores p');
		$this->db->where('p.deleted', 0);
		$this->db->order_by('p.nombre', 'ASC');

		if (!empty($b)) {
			$this->db->like('p.nombre', $b);
		}

		$proveedores = $this->db->get()->result_array();
		return $proveedores;
	}

	public function full_info($id){
		// Obtener datos de proveedores
		$this->db->select('*');
		$this->db->from('proveedores p');
		$this->db->where('p.deleted', 0);
		$this->db->where('p.id', $id);
		$proveedor = $this->db->get()->row_array();

		// Obtener compras (facturas)
		$this->db->select('*');
		$this->db->from('compras c');
		$this->db->where('c.deleted', 0);
		//$this->db->where('c.id_tipo_compra', [1,3]);
		$this->db->where('c.id_proveedor', $id);
		$this->db->order_by('DATE_FORMAT(fecha, \'%Y%m\') DESC');
		$query = $this->db->get();
		$facturas = $query->result_array();
		foreach ($facturas as &$compra) {
			$compra['mes'] = date('Ym', strtotime($compra['fecha']));
			if (empty($compras[$compra['mes']])) {
				$netos[$compra['mes']] = 0;
				$brutos[$compra['mes']] = 0;
			}
			$compras[$compra['mes']][] = $compra;

			$netos[$compra['mes']] += $compra['total_neto'];
			$brutos[$compra['mes']] += $compra['total'];
		}
		$proveedor['facturas'] = $compras;
		$proveedor['netos'] = $netos;
		$proveedor['brutos'] = $brutos;

		return $proveedor;
	}

	/**
	 * Entrega info del proveedor para vista view
	 * Puede entregar detalle de compras por mes
	 * o productos disponibles o agotados
	 */
	public function detalle($id, $seccion, $filtros){
		// Obtener datos de proveedores
		$this->db->select('*');
		$this->db->from('proveedores p');
		$this->db->where('p.deleted', 0);
		$this->db->where('p.id', $id);
		$proveedor = $this->db->get()->row_array();

		if ($seccion == 'facturas') {

			// === 1. Obtener todos los periodos disponibles (formato YYYYMM) ===
			$periodos = $this->db
				->select('DISTINCT(DATE_FORMAT(fecha_recepcion, "%Y%m")) AS periodo', false)
				->from('compras')
				->where('id_proveedor', $id)
				->where('deleted', 0)
				->where('id_tipo_compra', $filtros['tipo_compra'])
				->order_by('periodo', 'DESC')
				->get()
				->result_array();

			$periodos = array_column($periodos, 'periodo');

			// === 2. Obtener todos los tipos de compra disponibles ===
			$tipos = $this->db
				->select('DISTINCT(id_tipo_compra)')
				->from('compras')
				->where('id_proveedor', $id)
				->where('deleted', 0)
				->order_by('id_tipo_compra', 'ASC')
				->get()
				->result_array();

			$tipos = array_column($tipos, 'id_tipo_compra');

			// === 3. Validar periodo y tipo seleccionados ===
			$periodo_seleccionado = $filtros['periodo'] ?? null;
			$tipo_seleccionado = $filtros['tipo_compra'] ?? null;

			// Si el periodo no existe o no fue enviado, usar el último disponible
			if (empty($periodo_seleccionado) || !in_array($periodo_seleccionado, $periodos)) {
				$periodo_seleccionado = $periodos[0] ?? null;
			}

			// Si el tipo no existe o no fue enviado, usar el de ID más bajo
			if (empty($tipo_seleccionado) || !in_array($tipo_seleccionado, $tipos)) {
				$tipo_seleccionado = $tipos[0] ?? null;
			}

			// === 4. Obtener las compras filtradas ===
			$this->db->select('*');
			$this->db->from('compras c');
			$this->db->where('c.deleted', 0);
			$this->db->where('c.id_proveedor', $id);

			if (!empty($tipo_seleccionado)) {
				$this->db->where('c.id_tipo_compra', $tipo_seleccionado);
			}
			if (!empty($periodo_seleccionado)) {
				$this->db->where('DATE_FORMAT(c.fecha_recepcion, "%Y%m") =', $periodo_seleccionado);
			}

			$this->db->order_by('c.fecha_recepcion', 'DESC');
			$this->db->order_by('c.folio', 'DESC');

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

			$neto = $bruto = 0;
			foreach ($compras as &$compra) {
				$compra['mes'] = date('Ym', strtotime($compra['fecha_recepcion']));
				$neto += $compra['total_neto'];
				$bruto += $compra['total'];
			}

			// === 5. Guardar los resultados ===
			$proveedor['facturas'] = $compras;
			$proveedor['periodos'] = $periodos;
			$proveedor['tipos_compras'] = $tipos;
			$proveedor['periodo_actual'] = $periodo_seleccionado;
			$proveedor['tipo_actual'] = $tipo_seleccionado;
			$proveedor['neto'] = $neto;
			$proveedor['bruto'] = $bruto;
		}
		if ($seccion == 'productos') {
			$dbps = (ENVIRONMENT == 'production') ? 'dementeg_presta' : 'dementelocal';

			$this->db->select('
				p.id,
				p.ps_id,
				sa.id_product,
				p.nombre AS nombre,
				p.stock,
				p.id_categoria,
				sa.physical_quantity AS ps_stock,
				p.disponibles,
				sa.quantity AS ps_disponibles,
				pl.available_now,
				pl.available_later,
				img.id_image AS ps_image_id
			');
			$this->db->from('productos p');
			$this->db->join($dbps.'.ps_stock_available sa', 'p.ps_id = sa.id_product', 'left');
			$this->db->join($dbps.'.ps_product_lang pl', 'p.ps_id = pl.id_product', 'left');
			$this->db->join($dbps.'.ps_image img', 'p.ps_id = img.id_product AND img.cover = 1', 'left');
			$this->db->where('p.deleted', 0);
			$this->db->where('p.id_proveedor', $id);
			$this->db->order_by('p.id DESC');

			// 🔸 Filtro por categoría (si aplica)
			if (!empty($filtros['categoria'])) {
				$this->db->where('p.id_categoria', $filtros['categoria']);
			}

			// 🔸 Filtro por existencias (si aplica)
			if (!empty($filtros['existencias']) && $filtros['existencias'] != 'todos') {
				if ($filtros['existencias'] == 'disponibles') {
					$this->db->where('p.disponibles >', 0);
				} elseif ($filtros['existencias'] == 'agotados') {
					$this->db->where('p.disponibles', 0);
				}
			}

			$proveedor['total'] = $this->db->count_all_results('', false);
			$this->db->limit($filtros['cantidad'], $filtros['inicio']);
			$productos = $this->db->get()->result_array();

			// 🔸 Agregar info de marketplaces
			$productos = $this->Producto->agregarMarketplaces($productos);
			/*
			// 🔸 Reorganizar por estado y categoría
			$r = [];
			foreach ($productos as $p) {
				if ($p['disponibles'] > 0) {
					$r['disponibles'][$p['id_categoria']][] = $p;
				} else {
					$r['agotados'][$p['id_categoria']][] = $p;
				}
			}
			*/

			$proveedor['productos'] = $productos;


			// === 2. Traer todas las categorías disponibles del proveedor ===
			$this->db->select('c.id AS id_categoria, c.nombre AS nombre_categoria');
			$this->db->from('productos p');
			$this->db->join('categorias c', 'p.id_categoria = c.id', 'inner');
			$this->db->where('p.deleted', 0);
			$this->db->where('p.id_proveedor', $id);
			$this->db->distinct();
			$this->db->order_by('c.nombre ASC');
			$categorias_disponibles = $this->db->get()->result_array();

			// Convertir a array asociativo [id => nombre]
			$categorias_array = [];
			foreach ($categorias_disponibles as $cat) {
				$proveedor['categorias'][$cat['id_categoria']] = $cat['nombre_categoria'];
			}

		}

		/*
		// Obtener compras (facturas)
		$this->db->select('*');
		$this->db->from('compras c');
		$this->db->where('c.deleted', 0);
		//$this->db->where('c.id_tipo_compra', [1,3]);
		$this->db->where('c.id_proveedor', $id);
		$this->db->order_by('DATE_FORMAT(fecha, \'%Y%m\') DESC');
		$query = $this->db->get();
		$facturas = $query->result_array();
		foreach ($facturas as &$compra) {
			$compra['mes'] = date('Ym', strtotime($compra['fecha']));
			if (empty($compras[$compra['mes']])) {
				$netos[$compra['mes']] = 0;
				$brutos[$compra['mes']] = 0;
			}
			$compras[$compra['mes']][] = $compra;

			$netos[$compra['mes']] += $compra['total_neto'];
			$brutos[$compra['mes']] += $compra['total'];
		}
		$proveedor['facturas'] = $compras;
		$proveedor['netos'] = $netos;
		$proveedor['brutos'] = $brutos;
*/
		return $proveedor;
	}

	/**
	 * Entrega los productos del proveedor agrupados por categoria en orden alfabético
	 */	
	public function productos($id) {
		$dbps = (ENVIRONMENT == 'production') ? 'dementeg_presta' : 'dementelocal';

		$this->db->select('p.id, p.ps_id, sa.id_product, p.nombre as nombre, p.stock, p.id_categoria, sa.physical_quantity as ps_stock, p.disponibles, sa.quantity as ps_disponibles, pl.available_now, pl.available_later');
		$this->db->from('productos p');
		$this->db->join($dbps.'.ps_stock_available sa','ON p.ps_id = sa.id_product', 'left');
		$this->db->join($dbps.'.ps_product_lang pl','ON p.ps_id = pl.id_product', 'left');
		$this->db->where('deleted', 0);
		$this->db->where('p.id_proveedor', $id);
		$this->db->order_by('id_categoria ASC, nombre ASC');
		$productos = $this->db->get()->result_array();

		$productos = $this->Producto->agregarMarketplaces($productos);

		$r = [];
		foreach($productos as $p) {
			if ($p['disponibles'] > 0) {
				$r['disponibles'][$p['id_categoria']][] = $p;
			}
			else {
				$r['agotados'][$p['id_categoria']][] = $p;
			}
		}


		return $r;

	}

}