<?php
class Tarea_model extends CI_Model {

    /**
     * Entrega una lista de todas las tareas del usuario indicado
     * @param $filtros filtra por usuario, estado
     */
    public function listado($filtros = []) {
		$idUsuario = $_SESSION['usuario']['id'];

        $this->db->select('*');
        $this->db->from('tareas t');
        $this->db->where('t.deleted', 0);

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

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

        if (!empty($filtros['id_estado_tarea'])) {
            $filtros['id_estado_tarea'] = ($filtros['id_estado_tarea'] == -1) ? [1, 2, 3] : $filtros['id_estado_tarea'];
            $this->db->where_in('t.id_estado_tarea', $filtros['id_estado_tarea']);
        }

		if (!empty($filtros['tipo_tarea'])) {
			if ($filtros['tipo_tarea'] == 1) {
				$this->db->where('t.id_solicitante !=', $idUsuario);
			}
            elseif ($filtros['tipo_tarea'] == 2) {
				$this->db->where('t.id_responsable !=', $idUsuario);
			}
			elseif ($filtros['tipo_tarea'] == 3) {
				$this->db->where('t.id_solicitante', $idUsuario);
				$this->db->where('t.id_responsable', $idUsuario);
			}
        }

		if ($filtros['id_estado_tarea'] == 4) {
			$this->db->order_by('t.fecha_fin', 'DESC');
		}
		else if ($filtros['id_estado_tarea'] == 0) {
			$this->db->order_by('t.created', 'DESC');
		}
		else {
			$this->db->order_by('t.prioridad = 0', 'ASC', false);
			$this->db->order_by('t.prioridad', 'ASC');
			$this->db->order_by('t.fecha_limite', 'ASC');
		}

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

    /**
     * Entrega toda la informacion de una tarea
     * @param $id id de la tarea que se solicita
     */
    public function info($id = null) {
        $this->db->select('*');
        $this->db->from('tareas t');
        $this->db->where('t.id', $id);
        $this->db->where('t.deleted', 0);
        $tarea = $this->db->get()->row_array();

        $this->db->select('*');
        $this->db->from('comentarios_tareas');
        $this->db->where('id_tarea', $tarea['id']);
        $this->db->where('deleted', 0);
        $this->db->order_by('created DESC');
        $tarea['comentarios'] = $this->db->get()->result_array();

        return $tarea;
    }

    /**
     * Retorna los datos necesarios para gestionar tareas
     * Usuarios
     * Estados de tareas
     */
    public function datos_globales($data) {
        $data['usuariosActivos'] = $this->Usuario->lista(1);
        $data['usuarios'] = $this->Usuario->lista();

        $CI =& get_instance();
        $CI->load->model('EstadoTarea_model', 'EstadoTarea', true);
        $data['estadosTareas'] = $this->EstadoTarea->lista();

        return $data;
    }

    /**
     * Guardar datos de una nueva tarea o una edición
     * 
     * 
     */
	public function guardar($data) {
		// Carga modelo de notificaciones si no está cargado
		if (!isset($this->Notificacion_model)) {
			$this->load->model('Notificacion_model');
		}

		$id_usuario_actual = isset($_SESSION['usuario']['id']) ? $_SESSION['usuario']['id'] : null;

		if (empty($data['id'])) {
			// Crear nueva tarea
			$data['id_estado_tarea'] = 1;
			$this->db->insert('tareas', $data);
			$id_tarea = $this->db->insert_id();

			$tarea = $this->db->get_where('tareas', ['id' => $id_tarea])->row();

			// Notificar al responsable que tiene una nueva tarea (si no es quien crea)
			if ($tarea->id_responsable != $id_usuario_actual) {
				$mensaje = "Se te ha creado una nueva tarea: '{$tarea->titulo}'.";
				$this->Notificacion_model->agregar('1', 'nueva_tarea', $mensaje, $tarea->id_responsable, base_url("tareas/detalle/{$id_tarea}"));
			}
		}
		else {
			// Actualizar tarea
			$this->db->where('id', $data['id']);
			$this->db->where('deleted', 0);
			$tarea_actual = $this->db->get('tareas')->row_array();

			$notificar_estado = false;
			$notificar_otro_cambio = false;
			$notificar_cambio_responsable = false;

			// Detectar cambio de responsable
			if (isset($data['id_responsable']) && $data['id_responsable'] != $tarea_actual['id_responsable']) {
				$notificar_cambio_responsable = true;
			}

			if (!empty($data['id_estado_tarea']) && $data['id_estado_tarea'] != $tarea_actual['id_estado_tarea']) {
				$notificar_estado = true;
			}

			if (isset($data['descripcion']) && $data['descripcion'] != $tarea_actual['descripcion']) {
				$notificar_otro_cambio = true;
			}

			// Actualizar fechas segun estado
			if (!empty($data['id_estado_tarea'])) {
				if ($data['id_estado_tarea'] == 2 && $tarea_actual['fecha_inicio'] == '0000-00-00 00:00:00') {
					$data['fecha_inicio'] = date('Y-m-d H:i:s');
				}
				if ($data['id_estado_tarea'] == 2 && $tarea_actual['fecha_fin'] != '0000-00-00 00:00:00') {
					$data['fecha_fin'] = '0000-00-00 00:00:00';
				}
				if ($data['id_estado_tarea'] == 3 && $tarea_actual['fecha_fin'] == '0000-00-00 00:00:00') {
					$data['fecha_fin'] = date('Y-m-d H:i:s');
				}
				if ($data['id_estado_tarea'] == 4 && $tarea_actual['fecha_fin'] == '0000-00-00 00:00:00') {
					$data['fecha_fin'] = date('Y-m-d H:i:s');
				}
			}

			$this->db->where('id', $data['id']);
			$this->db->update('tareas', $data);
			$id_tarea = $data['id'];

			$tarea_actualizada = $this->db->get_where('tareas', ['id' => $id_tarea])->row();

			// Obtener nombre del estado nuevo para la notificación
			$estado = $this->db->get_where('estados_tareas', ['id' => $data['id_estado_tarea']])->row();
			$nombre_estado = $estado ? $estado->nombre : "ID {$data['id_estado_tarea']}";

			// Usuarios involucrados (solicitante y responsable)
			$usuarios = array_unique([$tarea_actualizada->id_solicitante, $tarea_actualizada->id_responsable]);

			// Quitar usuario que hace el cambio
			$usuarios = array_filter($usuarios, function($u) use ($id_usuario_actual) {
				return $u != $id_usuario_actual;
			});

			// Notificar cambio de estado
			if ($notificar_estado) {
				$mensaje = "La tarea '{$tarea_actualizada->titulo}' cambió a estado '{$nombre_estado}'.";
				foreach ($usuarios as $id_usuario) {
					$this->Notificacion_model->agregar('1', 'estado_tarea', $mensaje, $id_usuario, base_url("tareas/detalle/{$id_tarea}"));
				}
			}

			// Notificar otros cambios
			if ($notificar_otro_cambio) {
				$mensaje = "La tarea '{$tarea_actualizada->titulo}' fue modificada.";
				foreach ($usuarios as $id_usuario) {
					$this->Notificacion_model->agregar('1', 'modificacion_tarea', $mensaje, $id_usuario, base_url("tareas/detalle/{$id_tarea}"));
				}
			}

			// Notificar cambio de responsable
			if ($notificar_cambio_responsable) {
				// Nuevo responsable
				if ($data['id_responsable'] != $id_usuario_actual) {
					$mensaje_nuevo = "Se te ha asignado la tarea: '{$tarea_actualizada->titulo}'.";
					$this->Notificacion_model->agregar('1', 'asignacion_tarea', $mensaje_nuevo, $data['id_responsable'], base_url("tareas/detalle/{$id_tarea}"));
				}

				// Anterior responsable
				if ($tarea_actual['id_responsable'] != $id_usuario_actual) {
					$mensaje_antiguo = "La tarea '{$tarea_actualizada->titulo}' se ha asignado a otro usuario.";
					$this->Notificacion_model->agregar('1', 'reasignacion_tarea', $mensaje_antiguo, $tarea_actual['id_responsable'], base_url("tareas/detalle/{$id_tarea}"));
				}
			}
		}

		return ['status' => 'success', 'id_tarea' => $id_tarea];
	}


	/*
    public function guardar($data) {
        //revisar si viene id y si viene se hace update
        if (empty($data['id'])) {
            //$data['created'] = date('Y-m-d H:i:s');
            $data['id_estado_tarea'] = 1;
            $this->db->insert('tareas', $data);
            $return['id_tarea'] = $this->db->insert_id();
        }
        else {
            // Validamos estado anterior de la venta y si cambia
            if (!empty($data['id_estado_tarea'])) {
                $this->db->where('id', $data['id']);

                $this->db->from('tareas t');
                $this->db->where('t.id', $data['id']);
                $this->db->where('t.deleted', 0);
                $tarea = $this->db->get()->row_array();
                // Marca fecha de inicio cuando pasa a En Proceso por primera vez
                if ($data['id_estado_tarea'] == 2 && $tarea['fecha_inicio'] == '0000-00-00 00:00:00') {
                    $data['fecha_inicio'] = date('Y-m-d H:i:s');
                }

                // Marca fecha de fin cuando pasa a En Validación con fecha fin vacía
                if ($data['id_estado_tarea'] == 3 && $tarea['fecha_fin'] == '0000-00-00 00:00:00') {
                    $data['fecha_fin'] = date('Y-m-d H:i:s');
                }
                // Limpia fecha fin si pasa nuevamente a preparación en curso
                if ($data['id_estado_tarea'] == 2 && $tarea['fecha_fin'] != '0000-00-00 00:00:00') {
                    $data['fecha_fin'] = '0000-00-00 00:00:00';
                }

            }
            $this->db->where('id', $data['id']);
            $this->db->update('tareas', $data);
            $return['id_tarea'] = $data['id'];
        }
        $return['status'] = 'success';
        return $return;
    }
*/

    /**
	 * Cuenta cantidad de tareas pendientes para el usuario activo
	 */
	public function pendientes() {
        if (!empty($_SESSION['usuario'])) {
            $estadosPendientes = [1, 2];
            $estadosValidacion = [3];
            $idUsuario = $_SESSION['usuario']['id'];

            $this->db->from('tareas t');
            $this->db->where('deleted', 0);
            $this->db->where_in('id_estado_tarea', $estadosPendientes);
            $this->db->where('id_responsable', $idUsuario);
			$this->db->where('id_solicitante !=', $idUsuario);
            $pendientes = $this->db->get()->result_array();

            $this->db->from('tareas t');
            $this->db->where('deleted', 0);
            $this->db->where_in('id_estado_tarea', $estadosValidacion);
			$this->db->where('id_responsable !=', $idUsuario);
            $this->db->where('id_solicitante', $idUsuario);
            $enValidacion = $this->db->get()->result_array();
            //pr($this->db->last_query());

			$this->db->from('tareas t');
            $this->db->where('deleted', 0);
            $this->db->where_in('id_estado_tarea', $estadosPendientes);
			$this->db->where('id_responsable', $idUsuario);
            $this->db->where('id_solicitante', $idUsuario);
            $autotareas = $this->db->get()->result_array();

            $_SESSION['tareas_pendientes'] = count($pendientes);
            $_SESSION['tareas_validacion'] = count($enValidacion);
			$_SESSION['autotareas'] = count($autotareas);
			// Ahora solo se muestra la suma de pendientes más Validación
            $_SESSION['tareas_revisar'] = count($pendientes) + count($enValidacion); // + count($autotareas);
            //pr($_SESSION);
        }
    }


    /**
     * Guarda comentario de tarea
     */
	public function comentar($data) {
		if (!empty($data['id_tarea'])) {
			$id_usuario_actual = isset($_SESSION['usuario']['id']) ? $_SESSION['usuario']['id'] : null;
			$data['id_usuario'] = $id_usuario_actual;

			$this->db->insert('comentarios_tareas', $data);
			$id_comentario = $this->db->insert_id();

			// Obtener datos de la tarea para notificar
			$tarea = $this->db->get_where('tareas', ['id' => $data['id_tarea'], 'deleted' => 0])->row();
			if ($tarea) {
				// Usuarios a notificar: solicitante y responsable (sin el que comenta)
				$usuarios = array_unique([$tarea->id_solicitante, $tarea->id_responsable]);
				$usuarios = array_filter($usuarios, function($u) use ($id_usuario_actual) {
					return $u != $id_usuario_actual;
				});

				// Cargar modelo Notificacion_model si no está cargado
				if (!isset($this->Notificacion_model)) {
					$this->load->model('Notificacion_model');
				}

				$mensaje = "Se ha agregado un comentario en la tarea '{$tarea->titulo}'.";

				foreach ($usuarios as $id_usuario) {
					$this->Notificacion_model->agregar('1', 'comentario_tarea', $mensaje, $id_usuario, base_url("tareas/detalle/{$data['id_tarea']}"));
				}
			}

			// Retornar el comentario insertado
			$this->db->from('comentarios_tareas');
			$this->db->where('id', $id_comentario);
			return $this->db->get()->result_array();
		}
		else {
			return ['status' => 'error', 'message' => 'Falta id_tarea'];
		}
	}

}