-- =============================================================
-- LIS 08 — Vistas del sistema
-- Todas usan CREATE OR REPLACE para poder re-ejecutar sin error.
-- =============================================================

-- -----------------------------------------------------------
-- v_muestras_hoy
-- Muestras del día en el turnero (estado en tiempo real).
-- Usada por: dashboard, widget lugar.php
-- -----------------------------------------------------------
CREATE OR REPLACE VIEW v_muestras_hoy AS
SELECT
    tm.id,
    tm.solicitud_id,
    tm.tipo_muestra,
    COALESCE(lt.nombre, tm.tipo_muestra)  AS tipo_muestra_label,
    lt.color_hex                          AS tipo_muestra_color,
    tm.estado,
    tm.motivo_rechazo,
    tm.recibida_at,
    ts.turno_id,
    tt.codigo                             AS turno_codigo,
    ts.lugar_id,
    tl.nombre                             AS lugar_nombre,
    ts.paciente_id,
    lp.nombre_completo                    AS paciente_nombre,
    lp.numero_documento                   AS paciente_documento,
    DATE(tt.creado_at)                    AS fecha
FROM      turnero_muestras    tm
JOIN      turnero_solicitudes ts  ON ts.id  = tm.solicitud_id
JOIN      turnero_turnos      tt  ON tt.id  = ts.turno_id
JOIN      turnero_lugares     tl  ON tl.id  = ts.lugar_id
LEFT JOIN lab_pacientes       lp  ON lp.id  = ts.paciente_id
LEFT JOIN lab_tipos_muestra   lt  ON lt.codigo = tm.tipo_muestra;

-- -----------------------------------------------------------
-- v_muestras_pendientes_hoy
-- Solo las que faltan recibir hoy.
-- Usada por: contador en dashboard, alerta visual
-- -----------------------------------------------------------
CREATE OR REPLACE VIEW v_muestras_pendientes_hoy AS
SELECT *
FROM v_muestras_hoy
WHERE estado = 'pendiente'
  AND fecha  = CURDATE();

-- -----------------------------------------------------------
-- v_recepcion_completa
-- Histórico Firebird con todas las FK resueltas.
-- Usada por: módulo de consulta histórica (solo lectura)
-- -----------------------------------------------------------
CREATE OR REPLACE VIEW v_recepcion_completa AS
SELECT
    r.id,
    r.fecha_recepcion,
    r.hora_inicio,
    r.prefijo,
    r.num_factura,
    CONCAT(COALESCE(r.prefijo,''), '-',
           LPAD(COALESCE(r.num_factura, 0), 6, '0'))   AS factura,
    r.valor_total,
    r.valor_desc,
    (r.valor_total - r.valor_desc)                     AS valor_neto,
    r.paciente_id,
    r.cod_paciente_legacy,
    COALESCE(lp.nombre_completo, r.cod_paciente_legacy) AS paciente_nombre,
    lp.numero_documento                                  AS paciente_documento,
    lp.tipo_documento                                    AS paciente_tipo_doc,
    r.medico_id,
    r.cod_medico_legacy,
    CONCAT(COALESCE(m.nombres,''), ' ', COALESCE(m.apellidos,'')) AS medico_nombre,
    m.cod_especialidad                                   AS medico_especialidad,
    r.nit_empresa,
    COALESCE(e.nombre, r.nit_empresa)                    AS empresa_nombre,
    r.subgrupo,
    r.diag_ppal,
    r.tipo_usuario,
    r.autorizacion,
    r.usuario
FROM      lab_recepciones r
LEFT JOIN lab_pacientes   lp ON lp.id  = r.paciente_id
LEFT JOIN medicos         m  ON m.id   = r.medico_id
LEFT JOIN lab_empresas    e  ON e.nit  = r.nit_empresa;

-- -----------------------------------------------------------
-- v_relacion_completa
-- Exámenes por recepción con nombre resuelto.
-- -----------------------------------------------------------
CREATE OR REPLACE VIEW v_relacion_completa AS
SELECT
    lr.recepcion_id,
    r.fecha_recepcion,
    r.prefijo,
    r.num_factura,
    lr.cod_examen_legacy,
    lr.exam_tipo_id,
    et.nombre        AS examen_nombre,
    et.categoria     AS examen_categoria,
    et.tipo_muestra  AS tipo_muestra,
    lr.precio,
    lr.reportado,
    lr.fecha_reportado,
    lr.reportado_por,
    lr.validado,
    lr.usuario_valida,
    lr.fecha_valida
FROM      lab_relaciones   lr
JOIN      lab_recepciones  r   ON r.id  = lr.recepcion_id
LEFT JOIN exam_tipos       et  ON et.id = lr.exam_tipo_id;

-- -----------------------------------------------------------
-- v_examen_precio
-- Precio efectivo de cada examen en cada tarifa.
-- Resuelve tarifas derivadas por porcentaje.
-- Usada por: motor de precios en nueva recepción
-- -----------------------------------------------------------
CREATE OR REPLACE VIEW v_examen_precio AS
SELECT
    et.id                                       AS exam_tipo_id,
    et.codigo,
    et.codigo_legacy,
    et.nombre                                   AS examen_nombre,
    et.categoria,
    et.tipo_muestra,
    ti.id                                       AS tarifa_id,
    ti.nombre                                   AS tarifa_nombre,
    ti.porcentaje,
    ti.tarifa_origen,
    lt.valor                                    AS valor_almacenado,
    CASE
        WHEN ti.porcentaje > 0 AND ti.tarifa_origen IS NOT NULL
             AND lt_base.valor IS NOT NULL
        THEN ROUND(lt_base.valor * (1 + ti.porcentaje / 100), 0)
        ELSE lt.valor
    END                                         AS valor_efectivo,
    lt.recargo_urg,
    lt.recargo_fes,
    lt.recargo_esp
FROM      exam_tipos     et
JOIN      lab_tarifas    lt       ON lt.exam_tipo_id = et.id
JOIN      lab_tarifas_id ti       ON ti.id           = lt.tarifa_id
LEFT JOIN lab_tarifas    lt_base  ON lt_base.exam_tipo_id = et.id
                                 AND lt_base.tarifa_id    = ti.tarifa_origen;

-- -----------------------------------------------------------
-- v_paciente_resumen
-- Vista unificada: pacientes del nuevo sistema + migrados.
-- -----------------------------------------------------------
CREATE OR REPLACE VIEW v_paciente_resumen AS
SELECT
    id,
    nombre_completo,
    tipo_documento,
    numero_documento,
    telefono,
    email,
    fecha_nacimiento,
    genero,
    ciudad,
    eps,
    es_historico,
    codigo_legacy,
    created_at
FROM lab_pacientes
WHERE is_active = 1;

-- -----------------------------------------------------------
-- v_turno_muestras_estado
-- Estado agregado de muestras por turno (para cola y dashboard).
-- -----------------------------------------------------------
CREATE OR REPLACE VIEW v_turno_muestras_estado AS
SELECT
    ts.turno_id,
    COUNT(*)                                              AS total_muestras,
    SUM(tm.estado = 'pendiente')                          AS pendientes,
    SUM(tm.estado = 'recibida')                           AS recibidas,
    SUM(tm.estado = 'rechazada')                          AS rechazadas,
    CASE
        WHEN SUM(tm.estado = 'pendiente') = 0 THEN 'completo'
        WHEN SUM(tm.estado = 'recibida')  = 0 AND SUM(tm.estado = 'rechazada') = 0
        THEN 'sin_recibir'
        ELSE 'parcial'
    END                                                   AS estado_global
FROM      turnero_muestras    tm
JOIN      turnero_solicitudes ts ON ts.id = tm.solicitud_id
GROUP BY  ts.turno_id;
