<?php

class Notificacion_model extends CI_Model {

	public function listado($idUsuario = null, $cantidad = [], $filtros = []) {
		$this->db->select("*");
		$this->db->from('notificaciones');
		$this->db->where('id_usuario', $idUsuario);

		// Aplicar filtro por tipo (si existe y no está vacío)
		if (!empty($filtros['tipo'])) {
			$this->db->where('tipo', $filtros['tipo']);
		}

		// Aplicar filtro por estado leído (acepta 0 o 1, incluso si es '0')
		if (isset($filtros['leido']) && $filtros['leido'] !== '') {
			$this->db->where('leido', $filtros['leido']); // 0 o 1
		}

		$this->db->order_by('created', 'DESC');

		// Total de registros con filtros (sin resetear el query)
		$result['total'] = $this->db->count_all_results('', false);

		// Aplicar paginación
		if (!empty($cantidad)) {
			$this->db->limit($cantidad[1], $cantidad[0]);
		}

		// Obtener datos
		$result['notificaciones'] = $this->db->get()->result_array();

		return $result;
	}

	public function getTipos($idUsuario) {
		$this->db->select('DISTINCT(tipo)', false);
		$this->db->from('notificaciones');
		$this->db->where('id_usuario', $idUsuario);
		$this->db->order_by('tipo', 'ASC');
		$query = $this->db->get();
		return $query->result_array();
	}

	// Agrega una notificación
    public function agregar($categoria, $tipo, $mensaje, $id_usuario, $link = null) {
        $data = [
			'categoria' => $categoria,
            'tipo' => $tipo,
            'mensaje' => $mensaje,
            'id_usuario' => $id_usuario,
            'link' => $link
        ];
        return $this->db->insert('notificaciones', $data);
    }

    // Obtiene notificaciones no leídas para un usuario
    public function obtener_no_leidas($id_usuario) {
        return $this->db
            ->where('id_usuario', $id_usuario)
            ->where('leido', 0)
            ->order_by('created', 'DESC')
            ->get('notificaciones')
            ->result_array();
    }

    // Marca una notificación como leída
    public function marcar_leida($id) {
        return $this->db->where('id', $id)->update('notificaciones', ['leido' => 1]);
    }

	public function contar_no_leidas($id_usuario) {
		$this->db->where('id_usuario', $id_usuario);
		$this->db->where('leido', 0);
		return (int) $this->db->count_all_results('notificaciones');
	}

	public function actualizar_notificaciones_sesion() {
		$CI =& get_instance();

		if (isset($_SESSION['usuario']['id'])) {
			$id_usuario = $_SESSION['usuario']['id'];

			$cantidad = $this->contar_no_leidas($id_usuario);
			$_SESSION['usuario']['notificaciones_no_leidas'] = $cantidad;

			$notificaciones = $this->obtener_no_leidas($id_usuario);
			$_SESSION['usuario']['notificaciones'] = $notificaciones;
		}
	}

	public function marcar_leidas_por_link($link) {
		$this->db->where('id_usuario', $_SESSION['usuario']['id']);
		$this->db->where('leido', 0);
		$this->db->where('link', $link);
		$this->db->update('notificaciones', ['leido' => 1]);

		
		$this->actualizar_notificaciones_sesion();
	}


	public function evaluar_agotado_tienda($idProducto, $idAlmacen, $nombreProducto, $idCanal) {
		$this->db->from('almacenes');
		$this->db->where('id', $idAlmacen);
		$this->db->where('deleted', 0);
		$almacen = $this->db->get()->row_array();

		if ($almacen['tipo'] != 2) return;

		$this->db->from('almacenes_productos');
		$this->db->where('id_producto', $idProducto);
		$this->db->where('id_almacen', $idAlmacen);
		$ap = $this->db->get()->row_array();

		if ($ap['deseados'] < 0) return;

		// Agotado exclusiva
		if (!empty($almacen['id_bodega_exclusiva'])) {
			$this->db->from('almacenes_productos ap');
			$this->db->join('almacenes a','ap.id_almacen = a.id','left');
			$this->db->where('ap.id_almacen',$almacen['id_bodega_exclusiva']);
			$this->db->where('ap.id_producto',$idProducto);
			$this->db->where('ap.deleted',0);
			$this->db->where('a.deleted',0);
			$bodegaExclusiva = $this->db->get()->row_array();

			if ($bodegaExclusiva && $bodegaExclusiva['disponibles'] > 0){
				$mensaje = 'Producto '.$nombreProducto.' agotado en '.$almacen['nombre'].
						'. Existen '.$bodegaExclusiva['disponibles'].' unidades en '.$bodegaExclusiva['nombre'].' para reponer.';
				$this->agregar(2,'agotado_exclusiva',$mensaje,$_SESSION['usuario']['id'],base_url("productos/detalle/{$idProducto}"));
				return;
			}
		}

		// Agotado central
		$this->db->select('SUM(ap.disponibles) as total');
		$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('a.tipo',1);
		$this->db->where('a.stock_valido',1);
		$this->db->where('ap.deleted',0);
		$this->db->where('a.deleted',0);
		$res = $this->db->get()->row_array();

		$stockCentrales = $res ? (int)$res['total'] : 0;
		if ($stockCentrales > 0){
			$mensaje = 'Producto '.$nombreProducto.' agotado en '.$almacen['nombre'].'. Existen '.$stockCentrales.' unidades en bodega para reponer.';
			$this->notificar_coordinadores($mensaje,$idProducto,$idCanal,'agotado_central');
		}
	}

	public function evaluar_agotado_online($idProducto, $idAlmacen, $nombreProducto){

		$this->db->from('almacenes');
		$this->db->where('id',$idAlmacen);
		$almacen = $this->db->get()->row_array();
		if ($almacen['stock_online'] != 1) return;

		$this->db->select('SUM(ap.disponibles) as total');
		$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('a.stock_online',1);
		$this->db->where('a.stock_valido',1);
		$this->db->where('a.deleted',0);
		$this->db->where('ap.deleted',0);
		$stockOnline = $this->db->get()->row_array();

		if ($stockOnline['total'] > 0) return;

		$this->db->select('SUM(ap.disponibles) as total');
		$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('a.stock_online',0);
		$this->db->where('a.stock_valido',1);
		$this->db->where('a.deleted',0);
		$this->db->where('ap.deleted',0);
		$stockNoOnline = $this->db->get()->row_array();

		if ($stockNoOnline['total'] > 0){
			$mensaje = 'Producto '.$nombreProducto.' agotado para Venta Online pero existe stock en otros almacenes.';
			$this->notificar_coordinadores($mensaje,$idProducto,0,'agotado_online');
		}
	}

	private function notificar_coordinadores($mensaje,$idProducto,$idCanal=0,$tipo='agotado'){
		$notificados = [];

		$this->db->from('usuarios');
		$this->db->where_in('id_grupo',[2,3]);
		$this->db->where('deleted',0);
		$usuarios = $this->db->get()->result_array();

		foreach($usuarios as $u){
			if ($u['id_canal'] == 0 || $u['id_canal'] == $idCanal){
				if (!in_array($u['id'],$notificados)){
					$this->agregar(2,$tipo,$mensaje,$u['id'],base_url("productos/detalle/{$idProducto}"));
					$notificados[] = $u['id'];
				}
			}
		}

		// Notificación temporal a Edu
		/*
		if (!in_array(1,$notificados)){
			$this->agregar(2,$tipo,$mensaje,1,base_url("productos/detalle/{$idProducto}"));
		}
		*/
	}
}