<?php

class Quiebre_model extends CI_Model
{
	public function quiebres($filtros = []) {
		$this->db->select('q.*, p.nombre, p.id as id_producto, p.ps_id');
		$this->db->from('quiebres q');
		$this->db->join('productos p', 'p.id = q.id_producto', 'left');

		if (!empty($filtros['fecha_desde'])) {
			$this->db->where('q.fecha_quiebre >=', $filtros['fecha_desde']);
		}
		if (!empty($filtros['fecha_hasta'])) {
			$this->db->where('q.fecha_quiebre <=', $filtros['fecha_hasta']);
		}

		if ($filtros['id_almacen'] >= 0) {
			$this->db->where('q.id_almacen', $filtros['id_almacen']);
		}

		if (!empty($filtros['id_proveedor'])) {
			$this->db->where('p.id_proveedor', $filtros['id_proveedor']);
		}

		if ($filtros['reposicion'] >= 0) {
			$this->db->where('q.requiere_reposicion', $filtros['reposicion']);
		}

		if ($filtros['estado'] >= 0) {
			$this->db->where('q.resuelto', $filtros['estado']);
		}

		$this->db->order_by('q.fecha_quiebre', 'DESC');

		$q = $this->db->get();
		$resultados = $q->result_array();

		if (empty($resultados)) return [];

		// Obtener ids únicos
		$ids_productos = array_unique(array_column($resultados, 'id_producto'));

		// Traer stocks
		$this->load->model('Almacen_model', 'Almacen', true);
		$stocks = $this->Almacen->stock_productos($ids_productos);

		// Mapear stock a cada quiebre
		foreach ($resultados as &$row) {
			$idP = $row['id_producto'];
			$row['stocks'] = $stocks[$idP] ?? [];
		}

		return $resultados;
	}


	public function evaluar_quiebre($idProducto, $idAlmacen, $idTipoResolucion = 1)
	{
		//pr('Evaluando quiebre');
		// Estado actual del producto en el almacén
		$this->db->from('almacenes_productos');
		$this->db->where('id_producto', $idProducto);
		$this->db->where('id_almacen', $idAlmacen);
		$this->db->where('deleted', 0);

		$ap = $this->db->get()->row_array();

		if (!$ap) {
			return;
		}

		// Verificar si el almacén es una sucursal
		$esSucursal = $this->db->from('almacenes')
			->where('id', $idAlmacen)
			->where('tipo', 2) // 2 = sucursal
			->where('deleted', 0)
			->count_all_results() > 0;

		// Quiebre por sucursal solo si es sucursal
		if ($esSucursal) {
			if ($ap['disponibles'] <= 0) {
				$this->abrir_quiebre_sucursal($idProducto, $idAlmacen, $ap);
			} else {
				$this->cerrar_quiebre_sucursal($idProducto, $idAlmacen, $idTipoResolucion);
			}
		}
	}

	private function abrir_quiebre_sucursal($idProducto, $idAlmacen, $ap)
	{
		//pr('Abrir quiebre');
		$this->db->from('quiebres');
		$this->db->where('id_producto', $idProducto);
		$this->db->where('id_almacen', $idAlmacen);
		$this->db->where('tipo_quiebre', 'sucursal');
		$this->db->where('resuelto', 0);
		$this->db->where('deleted', 0);

		$existe = $this->db->get()->row_array();

		if ($existe) return;

		$requiereReposicion = ($ap['deseados'] > 0) ? 1 : 0;

		$data = [
			'id_producto' => $idProducto,
			'id_almacen' => $idAlmacen,
			'tipo_quiebre' => 'sucursal',
			'requiere_reposicion' => $requiereReposicion,
			'resuelto' => $requiereReposicion ? 0 : 1,
			'fecha_quiebre' => date('Y-m-d H:i:s'),
			'deleted' => 0
		];

		$this->db->insert('quiebres', $data);
	}

	public function cerrar_quiebre_sucursal($idProducto, $idAlmacen, $idTipoResolucion = 1)
	{
		//pr('Cerrar quiebre');
		$idUsuario = $_SESSION['usuario']['id'] ?? 0;

		$this->db->where('id_producto', $idProducto);
		$this->db->where('id_almacen', $idAlmacen);
		$this->db->where('tipo_quiebre', 'sucursal');
		$this->db->where('resuelto', 0);
		$this->db->where('deleted', 0);

		$data = [
			'resuelto' => 1,
			'fecha_resolucion' => date('Y-m-d H:i:s'),
			'id_tipo_resolucion' => $idTipoResolucion,
			'id_usuario_resolucion' => $idUsuario
		];

		$this->db->update('quiebres', $data);
	}


	public function evaluar_quiebre_interno($idProducto, $idTipoResolucion = 1)
	{
		// Obtener ps_id del producto
		$this->db->select('ps_id');
		$this->db->from('productos');
		$this->db->where('id', $idProducto);
		$this->db->where('deleted', 0);

		$p = $this->db->get()->row_array();

		if (!$p || !$p['ps_id']) {
			return;
		}

		// Si es preventa, no evaluar quiebres
		if ($this->Producto->es_preventa_ps($p['ps_id'])) {
			return;
		}

		// Calcular stock interno (sin almacenes externos)
		$this->db->select_sum('ap.disponibles');
		$this->db->from('almacenes_productos ap');
		$this->db->join('almacenes a', 'a.id = ap.id_almacen');

		$this->db->where('ap.id_producto', $idProducto);
		$this->db->where('ap.deleted', 0);
		$this->db->where('a.deleted', 0);
		$this->db->where('a.tipo !=', 3); // excluir externos

		$total = $this->db->get()->row()->disponibles ?? 0;

		if ($total <= 0) {
			$this->abrir_quiebre_interno($idProducto);
		} else {
			$this->cerrar_quiebre_interno($idProducto, $idTipoResolucion);
		}
	}

	private function abrir_quiebre_interno($idProducto)
	{
		$this->db->from('quiebres');
		$this->db->where('id_producto', $idProducto);
		$this->db->where('tipo_quiebre', 'interno');
		$this->db->where('resuelto', 0);
		$this->db->where('deleted', 0);

		$existe = $this->db->get()->row_array();

		if ($existe) return;

		// Revisar si el producto requiere reposición
		$this->db->select('tipo_reposicion');
		$this->db->from('productos');
		$this->db->where('id', $idProducto);
		$this->db->where('deleted', 0);

		$p = $this->db->get()->row_array();

		$requiereReposicion = ($p && $p['tipo_reposicion'] != -1) ? 1 : 0;

		$data = [
			'id_producto' => $idProducto,
			'tipo_quiebre' => 'interno',
			'requiere_reposicion' => $requiereReposicion,
			'resuelto' => $requiereReposicion ? 0 : 1,
			'fecha_quiebre' => date('Y-m-d H:i:s'),
			'deleted' => 0
		];

		$this->db->insert('quiebres', $data);
	}

	private function cerrar_quiebre_interno($idProducto, $idTipoResolucion = 1)
	{
		$idUsuario = $_SESSION['usuario']['id'] ?? 0;

		if (!$idUsuario) {
			$idUsuario = 1; // usuario sistema
		}

		$this->db->where('id_producto', $idProducto);
		$this->db->where('tipo_quiebre', 'interno');
		$this->db->where('resuelto', 0);
		$this->db->where('deleted', 0);

		$data = [
			'resuelto' => 1,
			'fecha_resolucion' => date('Y-m-d H:i:s'),
			'id_tipo_resolucion' => $idTipoResolucion,
			'id_usuario_resolucion' => $idUsuario
		];

		$this->db->update('quiebres', $data);
	}

	/**
	 * Entrega los distintos tipos de resoluciones en lista
	 * Si se pide solo manuales, entrega opciones para select
	 */
	public function resoluciones_quiebres($manuales = FALSE) {
		$this->db->select('id, nombre');
		$this->db->from('tipos_resolucion_quiebre');

		if ($manuales) {
			$this->db->where('cierre_automatico', 0);
		}

		$this->db->order_by('id', 'ASC');

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

		foreach($temp as $r) {
			$result[$r['id']] = $r['nombre'];
		}

		return $result;
	}


	public function resolver_quiebre($id_quiebre, $id_resolucion) {

		$id_usuario = $_SESSION['usuario']['id'];

		$this->db->where('id', $id_quiebre);

		return $this->db->update('quiebres', [
			'resuelto' => 1,
			'id_tipo_resolucion' => $id_resolucion,
			'fecha_resolucion' => date('Y-m-d H:i:s'),
			'id_usuario_resolucion' => $id_usuario
		]);
	}


	public function reabrir_quiebre($id_quiebre) {

		$this->db->where('id', $id_quiebre);
		return $this->db->update('quiebres', [
			'resuelto' => 0,
			'id_tipo_resolucion' => 0,
			'fecha_resolucion' => '',
			'id_usuario_resolucion' => 0
		]);
	}
}