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

class Casos extends CI_Controller {

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

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

		$this->load->model('Caso_model');
	}

	/**
	 * Listado de casos pendientes
	 */
	public function index()
	{
		// Usuario logueado
		$id_usuario = $_SESSION['usuario']['id'];

		// Filtro de estado (GET)
		$estado_filtro = $this->input->get('estado') ?: 'activos';

		// Normalizamos estados según el filtro
		if ($estado_filtro === 'finalizados') {
			$estados = ['resuelto'];
		} else {
			// activos
			$estados = ['abierto', 'espera_interna', 'espera_cliente'];
		}

		// Traemos casos filtrados por estado
		$casos = $this->Caso_model->listar_por_estados($estados);

		// Separamos en mis casos y otros casos
		$mis_casos = [];
		$otros_casos = [];

		foreach ($casos as $caso) {
			if ((int)$caso['id_usuario_responsable'] === (int)$id_usuario) {
				$mis_casos[] = $caso;
			} else {
				$otros_casos[] = $caso;
			}
		}

		// Usuarios
		$data['usuarios_activos'] = $this->Usuario->lista(1);
		$data['usuarios'] = $this->Usuario->lista();

		// Datos para la vista
		$data['mis_casos'] = $mis_casos;
		$data['otros_casos'] = $otros_casos;
		$data['estado_filtro'] = $estado_filtro;

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

	/**
	 * Ver detalle de un caso
	 */
	public function ver($id)
	{
		// Limpiar notificaciones
		$this->load->model('Notificacion_model');
		$link = base_url('casos/ver/' . $id);
		$this->Notificacion_model->marcar_leidas_por_link($link);

		$caso = $this->Caso_model->obtener_por_id($id);

		if (empty($caso)) {
			show_404();
			return;
		}

		$data['caso'] = $caso;
		$data['usuarios'] = $this->Usuario->lista(1); // 1 = solo activos
		$data['users'] = $this->Usuario->lista(); // 1 = solo activos
		$data['usuario'] = $data['users'][$_SESSION['usuario']['id']];


		$data['title'] = 'Caso';
		$data['content'] = $this->load->view('casos/ver', $data , true);
		$this->load->view('default', $data);
	}

	/**
	 * Crear un nuevo caso
	 */
	public function guardar()
	{
		if ($this->input->method() !== 'post') {
			echo json_encode(['status' => 'error', 'message' => 'Método no permitido']);
			return;
		}

		$id_usuario = $this->input->post('id_usuario_responsable') ?: 0;

		$data = [
			'id_cliente'            => $this->input->post('id_cliente') ?: 0,
			'id_venta'              => $this->input->post('id_venta') ?: 0,
			'id_usuario_responsable'=> $id_usuario,
			'titulo'                => $this->input->post('titulo'),
			'descripcion'           => $this->input->post('descripcion'),
			'estado'                => $this->input->post('estado') ?: 'abierto',
			'fecha_compromiso'      => $this->input->post('fecha_compromiso') ?: '0000-00-00',
			'medio_contacto'        => $this->input->post('medio_contacto'),
			'nombre_contacto'       => $this->input->post('nombre'),
			'email_contacto'        => $this->input->post('email'),
			'telefono_contacto'     => $this->input->post('telefono_contacto'),
			'usuario_red_social'    => $this->input->post('usuario_red_social'),
			'deleted'               => 0,
			'id_usuario_creador'    => $_SESSION['usuario']['id'],
			'id_user'               => $_SESSION['usuario']['id']
		];

		$id_caso = $this->Caso_model->crear($data);

		// Si asignado es distinto de creador se debe enviar notificacion al asignado
		if ($_SESSION['usuario']['id'] != $id_usuario) {
			$this->load->model('Notificacion_model');
			$mensaje = 'Se te ha asignado el caso: ' . $data['titulo'];
			$this->Notificacion_model->agregar('3', 'asignacion_caso', $mensaje, $id_usuario, base_url("casos/ver/{$id_caso}"));
		}

		if ($id_caso) {
			echo json_encode(['status' => 'success', 'message' => 'Caso guardado', 'id' => $id_caso]);
		} else {
			echo json_encode(['status' => 'error', 'message' => 'No se pudo guardar el caso']);
		}
	}


	/**
	 * AJAX
	 * Cambiar estado de un caso
	 */
	public function cambiar_estado($id_caso)
	{
		if (!$this->input->is_ajax_request()) {
			show_404();
		}

		$this->output->set_content_type('application/json');

		$nuevo_estado = $this->input->post('estado');
		$id_user = $_SESSION['usuario']['id'];

		if (!$nuevo_estado || !$id_caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Datos incompletos'
			]);
			return;
		}

		$caso = $this->Caso_model->obtener_por_id($id_caso);
		if (!$caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Caso no encontrado'
			]);
			return;
		}

		$estado_anterior = $caso['estado'];

		if ($estado_anterior === $nuevo_estado) {
			echo json_encode([
				'ok' => true,
				'sin_cambios' => true
			]);
			return;
		}

		$this->Caso_model->actualizar_estado($id_caso, $nuevo_estado, $id_user);


		$data_log = [
			'id_caso'        => $id_caso,
			'tipo'           => 'estado',
			'descripcion'    => 'Cambio de estado de ' .$estado_anterior .' a ' . $nuevo_estado,
			'valor_anterior' => $estado_anterior,
			'valor_nuevo'    => $nuevo_estado,
			'id_user'        => $id_user
		];

		$data_log['created'] = $this->Caso_model->insertar_log($data_log);


		// Si asignado es distinto de modificador se debe enviar notificacion al asignado
		$id_usuario = $caso['id_usuario_responsable'];
		if ($id_user != $id_usuario) {
			$this->load->model('Notificacion_model');
			$mensaje = 'Ha cambiado el estado del caso: ' . $caso['titulo'];
			$this->Notificacion_model->agregar('3', 'cambio_estado_caso', $mensaje, $id_usuario, base_url("casos/ver/{$id_caso}"));
		}

		echo json_encode([
			'ok' => true,
			'data' => $data_log
		]);
	}

	/**
	 * AJAX
	 * Cambiar responsable de un caso
	 */
	public function cambiar_responsable($id_caso)
	{
		if (!$this->input->is_ajax_request()) {
			show_404();
		}

		$this->output->set_content_type('application/json');

		$nuevo_responsable = $this->input->post('id_usuario_responsable');
		$id_user = $_SESSION['usuario']['id'];

		if (!$nuevo_responsable || !$id_caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Datos incompletos'
			]);
			return;
		}

		$caso = $this->Caso_model->obtener_por_id($id_caso);
		if (!$caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Caso no encontrado'
			]);
			return;
		}

		$responsable_anterior = $caso['id_usuario_responsable'];

		if ($responsable_anterior === $nuevo_responsable) {
			echo json_encode([
				'ok' => true,
				'sin_cambios' => true
			]);
			return;
		}

		$this->Caso_model->actualizar_responsable($id_caso, $nuevo_responsable, $id_user);


		$users = $this->Usuario->lista(); // 1 = solo activos
		if ($responsable_anterior == 0) {
			$nombre_responsable_anterior = 'Sin Asignar';
		}
		else {
			$nombre_responsable_anterior = $users[$responsable_anterior];
		}

		$nombre_nuevo_responsable = $users[$nuevo_responsable];

		$data_log = [
			'id_caso'        => $id_caso,
			'tipo'           => 'responsable',
			'descripcion'    => 'Cambio de responsable de ' .$nombre_responsable_anterior .' a ' . $nombre_nuevo_responsable,
			'valor_anterior' => $responsable_anterior,
			'valor_nuevo'    => $nuevo_responsable,
			'id_user'        => $id_user
		];

		$data_log['created'] = $this->Caso_model->insertar_log($data_log);

		$data_log['nombre_responsable'] = $nombre_nuevo_responsable;

		// Si asignado anterior es distinto de modificador se debe enviar notificacion al asignado anterior
		if ($id_user != $responsable_anterior) {
			$this->load->model('Notificacion_model');
			$mensaje = 'Se ha asignado a otro usuario el caso: ' . $caso['titulo'];
			$this->Notificacion_model->agregar('3', 'cambio_asignado_caso', $mensaje, $responsable_anterior, base_url("casos/ver/{$id_caso}"));
		}

		// Si nuevo asignado es distinto de modificador se debe enviar notificacion al nuevo asignado
		if ($id_user != $nuevo_responsable) {
			$this->load->model('Notificacion_model');
			$mensaje = 'Se te ha reasignado el caso: ' . $caso['titulo'];
			$this->Notificacion_model->agregar('3', 'cambio_asignado_caso', $mensaje, $nuevo_responsable, base_url("casos/ver/{$id_caso}"));
		}

		echo json_encode([
			'ok' => true,
			'data' => $data_log
		]);
	}


	/**
	 * AJAX
	 * Cambiar responsable de un caso
	 */
	public function agregar_nota($id_caso)
	{
		if (!$this->input->is_ajax_request()) {
			show_404();
		}

		$this->output->set_content_type('application/json');

		$nota = $this->input->post('nota');
		$id_user = $_SESSION['usuario']['id'];

		if (!$nota || !$id_caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Datos incompletos'
			]);
			return;
		}

		$caso = $this->Caso_model->obtener_por_id($id_caso);
		if (!$caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Caso no encontrado'
			]);
			return;
		}

		$data_log = [
			'id_caso'        => $id_caso,
			'tipo'           => 'nota',
			'descripcion'    => $nota,
			'valor_anterior' => '',
			'valor_nuevo'    => $nota,
			'id_user'        => $id_user
		];

		$data_log['created'] = $this->Caso_model->insertar_log($data_log);

		// Si asignado es distinto de quien deja la nota debe enviar notificacion al asignado
		$id_usuario = $caso['id_usuario_responsable'];
		if ($id_user != $id_usuario) {
			$this->load->model('Notificacion_model');
			$mensaje = 'Se ha agregado una nota al caso: ' . $caso['titulo'];
			$this->Notificacion_model->agregar('3', 'agrega_nota_caso', $mensaje, $id_usuario, base_url("casos/ver/{$id_caso}"));
		}

		echo json_encode([
			'ok' => true,
			'data' => $data_log
		]);
	}


	/**
	 * AJAX
	 * Cambiar fecha de compromiso
	 */
	public function cambiar_fecha($id_caso)
	{
		if (!$this->input->is_ajax_request()) {
			show_404();
		}

		$nueva_fecha = $this->input->post('fecha_compromiso');
		$id_user = $_SESSION['usuario']['id'];

		if (!$id_caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Caso inválido'
			]);
			return;
		}

		$caso = $this->Caso_model->obtener_por_id($id_caso);
		if (!$caso) {
			echo json_encode([
				'ok' => false,
				'msg' => 'Caso no encontrado'
			]);
			return;
		}

		$fecha_anterior = $caso['fecha_compromiso'];

		if ($fecha_anterior === $nueva_fecha) {
			echo json_encode([
				'ok' => true,
				'sin_cambios' => true
			]);
			return;
		}

		$this->Caso_model->actualizar_fecha_compromiso(
			$id_caso,
			$nueva_fecha,
			$id_user
		);

		$data_log = [
			'id_caso'        => $id_caso,
			'tipo'           => 'fecha_compromiso',
			'descripcion'    => 'Cambio de fecha compromiso de ' . ($fecha_anterior ?: '—') . ' a ' . ($nueva_fecha ?: '—'), 
			'valor_anterior' => $fecha_anterior ?: '',
			'valor_nuevo'    => $nueva_fecha ?: '',
			'id_user'        => $id_user
		];

		$this->Caso_model->insertar_log($data_log);

		// Si asignado es distinto de quien cambia la fecha se debe enviar notificacion al asignado
		$id_usuario = $caso['id_usuario_responsable'];
		if ($id_user != $id_usuario) {
			$this->load->model('Notificacion_model');
			$mensaje = 'Se ha cambiado la fecha de compromiso del caso: ' . $caso['titulo'];
			$this->Notificacion_model->agregar('3', 'agrega_nota_caso', $mensaje, $id_usuario, base_url("casos/ver/{$id_caso}"));
		}

		echo json_encode([
			'ok'   => true,
			'data' => $data_log
		]);
	}

	/**
	 * Soft delete del caso
	 */
	public function eliminar($id)
	{
		$this->Caso_model->eliminar(
			$id,
			$_SESSION['usuario']['id']
		);

		redirect('casos');
	}

}
