<?php
/**
 * Asignacion — Asignación de enfermera a un domicilio.
 * Solo puede haber una asignación activa por domicilio (UNIQUE KEY).
 */

require_once __DIR__ . '/../../classes/Database.php';
require_once __DIR__ . '/ActividadAdmin.php';

class Asignacion {

    private Database $db;
    private ActividadAdmin $log;

    public function __construct() {
        $this->db  = Database::getInstance();
        $this->log = new ActividadAdmin();
    }

    // ─────────────────────────────────────────────────────────────────────────
    // CRUD
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * Obtener asignación por ID.
     */
    public function obtener(int $id): ?array {
        return $this->db->fetch("
            SELECT
                a.*,
                e.nombre_completo AS enfermera_nombre,
                e.telefono        AS enfermera_telefono,
                d.fecha_programada,
                d.hora_programada,
                d.estado          AS domicilio_estado,
                d.direccion,
                p.nombre_completo AS paciente_nombre
            FROM  lab_asignaciones a
            JOIN  lab_enfermeras   e ON e.id = a.enfermera_id
            JOIN  lab_domicilios   d ON d.id = a.domicilio_id
            JOIN  lab_pacientes    p ON p.id = d.paciente_id
            WHERE a.id = ?
        ", [$id]) ?: null;
    }

    /**
     * Asignar (o reasignar) enfermera a un domicilio.
     *  - Si ya existía asignación la reemplaza.
     */
    public function asignar(
        int $domicilioId,
        int $enfermeraId,
        ?int $adminId = null,
        string $notas = ''
    ): int {
        // ¿Ya existe?
        $existente = $this->db->fetch(
            'SELECT id FROM lab_asignaciones WHERE domicilio_id = ?',
            [$domicilioId]
        );

        if ($existente) {
            $this->db->update('lab_asignaciones', [
                'enfermera_id' => $enfermeraId,
                'asignada_por' => $adminId,
                'estado'       => 'asignada',
                'notas'        => $notas,
            ], 'id = ?', [$existente['id']]);

            $id = $existente['id'];
            $accion = 'reasignar';
        } else {
            $id = $this->db->insert('lab_asignaciones', [
                'domicilio_id' => $domicilioId,
                'enfermera_id' => $enfermeraId,
                'asignada_por' => $adminId,
                'estado'       => 'asignada',
                'notas'        => $notas,
            ]);
            $accion = 'asignar';
        }

        $this->log->registrar($adminId, 'asignaciones', $accion, $id, [
            'domicilio_id' => $domicilioId,
            'enfermera_id' => $enfermeraId,
        ]);

        return $id;
    }

    /**
     * Liberar asignación (sin eliminar, cambia estado a 'liberada').
     */
    public function liberar(int $id, ?int $adminId = null, string $motivo = ''): bool {
        $ok = $this->db->update('lab_asignaciones', ['estado' => 'liberada'], 'id = ?', [$id]);
        $this->log->registrar($adminId, 'asignaciones', 'liberar', $id, ['motivo' => $motivo]);
        return $ok > 0;
    }

    /**
     * Marcar asignación como completada.
     */
    public function completar(int $id, ?int $adminId = null): bool {
        $ok = $this->db->update('lab_asignaciones', ['estado' => 'completada'], 'id = ?', [$id]);
        $this->log->registrar($adminId, 'asignaciones', 'completar', $id);
        return $ok > 0;
    }

    // ─────────────────────────────────────────────────────────────────────────
    // Consultas
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * Asignaciones de una fecha (para vista de agenda general).
     */
    public function porFecha(string $fecha = ''): array {
        $fecha = $fecha ?: date('Y-m-d');
        return $this->db->fetchAll("
            SELECT
                a.*,
                e.nombre_completo  AS enfermera_nombre,
                e.telefono         AS enfermera_telefono,
                d.hora_programada,
                d.estado           AS domicilio_estado,
                d.direccion,
                d.barrio,
                p.nombre_completo  AS paciente_nombre,
                p.telefono         AS paciente_telefono
            FROM  lab_asignaciones  a
            JOIN  lab_enfermeras    e ON e.id = a.enfermera_id
            JOIN  lab_domicilios    d ON d.id = a.domicilio_id
            JOIN  lab_pacientes     p ON p.id = d.paciente_id
            WHERE d.fecha_programada = ?
            ORDER BY e.nombre_completo, d.hora_programada ASC
        ", [$fecha]);
    }

    /**
     * Carga actual del día: cuántos domicilios tiene cada enfermera hoy.
     */
    public function cargaHoy(): array {
        return $this->db->fetchAll("
            SELECT
                e.id,
                e.nombre_completo,
                e.telefono,
                COUNT(a.id) AS total_asignaciones,
                SUM(d.estado = 'completado') AS completados
            FROM  lab_enfermeras e
            JOIN  lab_asignaciones  a ON a.enfermera_id = e.id
            JOIN  lab_domicilios    d ON d.id = a.domicilio_id
            WHERE d.fecha_programada = CURDATE()
              AND a.estado NOT IN ('liberada')
            GROUP BY e.id
            ORDER BY total_asignaciones DESC
        ");
    }
}
