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

class Caso_model extends CI_Model {

	protected $tabla = 'casos';

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

	/**
	 * Crear un nuevo caso
	 */
	public function crear($data)
	{
		$this->db->insert($this->tabla, $data);
		return $this->db->insert_id();
	}

	/**
	 * Obtener un caso por id
	 */
	public function obtener_por_id($id)
	{
		
		$caso = $this->db
			->where('id', $id)
			->where('deleted', 0)
			->get($this->tabla)
			->row_array();

		$caso['logs'] = $this->db
			->where('id_caso', $id)
			->order_by('created DESC')
			->get('casos_log')
			->result_array();

		return $caso;
	}

	/**
	 * Listar casos pendientes de respuesta interna
	 */
	public function listar_pendientes()
	{
		return $this->db
			->where('deleted', 0)
			->where_in('estado', ['abierto', 'espera_interna'])
			->order_by('fecha_compromiso IS NULL', '', FALSE)
			->order_by('fecha_compromiso', 'ASC')
			->get($this->tabla)
			->result_array();
	}


	public function listar_por_estados(array $estados)
	{
		$this->db->from('casos c');
		$this->db->where_in('c.estado', $estados);
		$this->db->where('deleted', 0);
		$this->db->order_by('c.fecha_compromiso', 'ASC');

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

	/**
	 * Actualizar estado de un caso
	 */
	public function actualizar_estado($id, $estado, $id_user)
	{
		$this->db
			->where('id', $id)
			->update($this->tabla, [
				'estado'   => $estado,
				'id_user'  => $id_user
			]);

		return $this->db->affected_rows() > 0;
	}


	/**
	 * Asignar o cambiar responsable del caso
	 */
	public function actualizar_responsable($id, $id_usuario_responsable, $id_user)
	{
		$this->db
			->where('id', $id)
			->update($this->tabla, [
				'id_usuario_responsable' => $id_usuario_responsable,
				'id_user'                => $id_user
			]);

		return $this->db->affected_rows() > 0;
	}

	/**
	 * Asignar o cambiar fecha de compromiso
	 */
	public function actualizar_fecha_compromiso($id, $fecha, $id_user)
	{
		$this->db
			->where('id', $id)
			->update($this->tabla, [
				'fecha_compromiso' => $fecha ?: '0000-00-00',
				'id_user'          => $id_user
			]);

		return $this->db->affected_rows() > 0;
	}

	/**
	 * Soft delete del caso
	 */
	public function eliminar($id, $id_user)
	{
		$this->db
			->where('id', $id)
			->update($this->tabla, [
				'deleted'  => 1,
				'id_user'  => $id_user
			]);

		return $this->db->affected_rows() > 0;
	}


	public function obtener_estado($id)
	{
		return $this->db
			->select('estado')
			->from('casos')
			->where('id', $id)
			->get()
			->row_array();
	}


	public function insertar_log($data)
	{
		$this->db->insert('casos_log', [
			'id_caso'        => $data['id_caso'],
			'tipo'           => $data['tipo'],
			'descripcion'    => $data['descripcion'],
			'valor_anterior' => $data['valor_anterior'],
			'valor_nuevo'    => $data['valor_nuevo'],
			'id_user'        => $data['id_user'],
		]);

		if ($this->db->affected_rows() !== 1) {
			return false;
		}

		$id = $this->db->insert_id();

		$row = $this->db
			->select('created')
			->from('casos_log')
			->where('id', $id)
			->get()
			->row();

		return $row ? $row->created : false;
	}


	/**
	 * Cuenta cantidad de casoss pendientes para el usuario activo
	 */
	public function pendientes() {
        if (!empty($_SESSION['usuario'])) {
			$estadosPendientes = ['abierto', 'espera_interna', 'espera_cliente'];
            $idUsuario = $_SESSION['usuario']['id'];

            $this->db->from('casos c');
            $this->db->where('deleted', 0);
            $this->db->where_in('estado', $estadosPendientes);
            $this->db->where('id_usuario_responsable', $idUsuario);
            $pendientes = $this->db->get()->result_array();

            $_SESSION['casos_pendientes'] = count($pendientes);
        }
    }

}
