-- Parche 059
-- Normaliza la designacion del area DPCC secundaria sin borrar notas.
--
-- Regla 2026:
--   DNI 80299178: DPCC en 1ro, 2do, 3ro y 5to, secciones A y B.
--   DNI 70692822: DPCC en 4to, secciones A y B.
--
-- El parche es idempotente. Puede ejecutarse mas de una vez.
-- No elimina notas de nota_estudiante, nota_transversal_docente ni registro auxiliar.

START TRANSACTION;

SET @anio_activo := (
    SELECT id_anio_lectivo
    FROM anio_lectivo
    WHERE estado = 1
    ORDER BY anio DESC, id_anio_lectivo DESC
    LIMIT 1
);

SET @docente_80299178 := (
    SELECT d.id_docente
    FROM docente d
    INNER JOIN persona p ON p.id_persona = d.id_persona
    WHERE p.numero_documento = '80299178'
      AND d.estado = 1
    ORDER BY d.id_anio_lectivo DESC, d.id_docente DESC
    LIMIT 1
);

SET @persona_80299178 := (
    SELECT p.id_persona
    FROM persona p
    WHERE p.numero_documento = '80299178'
    LIMIT 1
);

SET @nombre_80299178 := (
    SELECT COALESCE(NULLIF(p.nombre_completo, ''), TRIM(CONCAT_WS(' ', p.apellido_paterno, p.apellido_materno, p.nombres)))
    FROM docente d
    INNER JOIN persona p ON p.id_persona = d.id_persona
    WHERE d.id_docente = @docente_80299178
    LIMIT 1
);

SET @docente_70692822 := (
    SELECT d.id_docente
    FROM docente d
    INNER JOIN persona p ON p.id_persona = d.id_persona
    WHERE p.numero_documento = '70692822'
      AND d.estado = 1
    ORDER BY d.id_anio_lectivo DESC, d.id_docente DESC
    LIMIT 1
);

SET @persona_70692822 := (
    SELECT p.id_persona
    FROM persona p
    WHERE p.numero_documento = '70692822'
    LIMIT 1
);

SET @nombre_70692822 := (
    SELECT COALESCE(NULLIF(p.nombre_completo, ''), TRIM(CONCAT_WS(' ', p.apellido_paterno, p.apellido_materno, p.nombres)))
    FROM docente d
    INNER JOIN persona p ON p.id_persona = d.id_persona
    WHERE d.id_docente = @docente_70692822
    LIMIT 1
);

SET @area_dpcc := (
    SELECT id_area
    FROM area_curricular
    WHERE id_nivel = 'SEC'
      AND activo = 1
      AND es_transversal = 0
      AND (
            UPPER(TRIM(COALESCE(descripcion, ''))) = 'DPCC'
            OR (
                UPPER(nombre) LIKE '%DESARROLLO PERSONAL%'
                AND UPPER(nombre) LIKE '%C%VICA%'
            )
      )
    ORDER BY id_area
    LIMIT 1
);

DROP TEMPORARY TABLE IF EXISTS tmp_dpcc_destino;
CREATE TEMPORARY TABLE tmp_dpcc_destino (
    id_aula INT UNSIGNED NOT NULL PRIMARY KEY,
    id_docente INT UNSIGNED NOT NULL,
    dni_docente VARCHAR(20) NOT NULL,
    docente_nombre VARCHAR(180) NULL,
    horas_semanales DECIMAL(5,2) NULL,
    grado VARCHAR(40) NOT NULL,
    seccion VARCHAR(10) NOT NULL
) ENGINE=MEMORY;

INSERT INTO tmp_dpcc_destino (
    id_aula, id_docente, dni_docente, docente_nombre, horas_semanales, grado, seccion
)
SELECT
    a.id_aula,
    @docente_80299178,
    '80299178',
    @nombre_80299178,
    3.00,
    UPPER(TRIM(g.descripcion)),
    UPPER(TRIM(s.nombre_corto))
FROM aula a
INNER JOIN grado g ON g.id_grado = a.id_grado
INNER JOIN seccion s ON s.id_seccion = a.id_seccion
WHERE @anio_activo IS NOT NULL
  AND @docente_80299178 IS NOT NULL
  AND @area_dpcc IS NOT NULL
  AND a.id_anio_lectivo = @anio_activo
  AND a.id_nivel = 'SEC'
  AND a.estado = 1
  AND UPPER(TRIM(g.descripcion)) IN ('PRIMERO', 'SEGUNDO', 'TERCERO', 'QUINTO')
  AND UPPER(TRIM(s.nombre_corto)) IN ('A', 'B');

INSERT INTO tmp_dpcc_destino (
    id_aula, id_docente, dni_docente, docente_nombre, horas_semanales, grado, seccion
)
SELECT
    a.id_aula,
    @docente_70692822,
    '70692822',
    @nombre_70692822,
    3.00,
    UPPER(TRIM(g.descripcion)),
    UPPER(TRIM(s.nombre_corto))
FROM aula a
INNER JOIN grado g ON g.id_grado = a.id_grado
INNER JOIN seccion s ON s.id_seccion = a.id_seccion
WHERE @anio_activo IS NOT NULL
  AND @docente_70692822 IS NOT NULL
  AND @area_dpcc IS NOT NULL
  AND a.id_anio_lectivo = @anio_activo
  AND a.id_nivel = 'SEC'
  AND a.estado = 1
  AND UPPER(TRIM(g.descripcion)) = 'CUARTO'
  AND UPPER(TRIM(s.nombre_corto)) IN ('A', 'B');

-- Mantiene sincronizados los usuarios docentes si ya existen.
UPDATE usuario_sistema
SET id_docente = @docente_80299178,
    id_persona = @persona_80299178,
    rol = 'DOCENTE',
    estado = 1
WHERE usuario = '80299178'
  AND @docente_80299178 IS NOT NULL
  AND @persona_80299178 IS NOT NULL;

UPDATE usuario_sistema
SET id_docente = @docente_70692822,
    id_persona = @persona_70692822,
    rol = 'DOCENTE',
    estado = 1
WHERE usuario = '70692822'
  AND @docente_70692822 IS NOT NULL
  AND @persona_70692822 IS NOT NULL;

-- Si ya existe la fila del docente correcto, se activa.
UPDATE docente_area_cargo da
INNER JOIN tmp_dpcc_destino t
        ON t.id_aula = da.id_aula
       AND t.id_docente = da.id_docente
SET da.estado = 1,
    da.horas_semanales = COALESCE(da.horas_semanales, t.horas_semanales),
    da.tipo_asignacion = 'MANUAL',
    da.fuente = 'PARCHE_059_DPCC_NORMALIZACION',
    da.observaciones = CONCAT('DPCC ', t.grado, ' ', t.seccion, ' normalizado por parche 059.'),
    da.actualizado_en = NOW()
WHERE da.id_anio_lectivo = @anio_activo
  AND da.id_area = @area_dpcc;

-- Si la unica fila existente pertenece a otro docente, se reasigna al docente correcto.
UPDATE docente_area_cargo da
INNER JOIN tmp_dpcc_destino t
        ON t.id_aula = da.id_aula
SET da.id_docente = t.id_docente,
    da.estado = 1,
    da.horas_semanales = COALESCE(da.horas_semanales, t.horas_semanales),
    da.tipo_asignacion = 'MANUAL',
    da.fuente = 'PARCHE_059_DPCC_NORMALIZACION',
    da.observaciones = CONCAT('DPCC ', t.grado, ' ', t.seccion, ' reasignado al DNI ', t.dni_docente, ' por parche 059.'),
    da.actualizado_en = NOW()
WHERE da.id_anio_lectivo = @anio_activo
  AND da.id_area = @area_dpcc
  AND da.id_docente <> t.id_docente
  AND NOT EXISTS (
      SELECT 1
      FROM docente_area_cargo ok
      WHERE ok.id_anio_lectivo = da.id_anio_lectivo
        AND ok.id_aula = da.id_aula
        AND ok.id_area = da.id_area
        AND ok.id_docente = t.id_docente
  );

-- Si por una importacion antigua quedan duplicados del aula/area, se desactivan los que no corresponden.
UPDATE docente_area_cargo da
INNER JOIN tmp_dpcc_destino t
        ON t.id_aula = da.id_aula
SET da.estado = 0,
    da.fuente = 'PARCHE_059_DPCC_NORMALIZACION',
    da.observaciones = CONCAT('DPCC ', t.grado, ' ', t.seccion, ' desactivado: responsable correcto DNI ', t.dni_docente, '.'),
    da.actualizado_en = NOW()
WHERE da.id_anio_lectivo = @anio_activo
  AND da.id_area = @area_dpcc
  AND da.id_docente <> t.id_docente
  AND EXISTS (
      SELECT 1
      FROM docente_area_cargo ok
      WHERE ok.id_anio_lectivo = da.id_anio_lectivo
        AND ok.id_aula = da.id_aula
        AND ok.id_area = da.id_area
        AND ok.id_docente = t.id_docente
        AND ok.estado = 1
  );

-- Crea solo las asignaciones faltantes.
INSERT INTO docente_area_cargo (
    id_docente, id_area, id_aula, id_anio_lectivo,
    horas_semanales, tipo_asignacion, fuente, observaciones, estado
)
SELECT
    t.id_docente,
    @area_dpcc,
    t.id_aula,
    @anio_activo,
    t.horas_semanales,
    'MANUAL',
    'PARCHE_059_DPCC_NORMALIZACION',
    CONCAT('DPCC ', t.grado, ' ', t.seccion, ' asignado al DNI ', t.dni_docente, ' por parche 059.'),
    1
FROM tmp_dpcc_destino t
WHERE NOT EXISTS (
    SELECT 1
    FROM docente_area_cargo da
    WHERE da.id_anio_lectivo = @anio_activo
      AND da.id_aula = t.id_aula
      AND da.id_area = @area_dpcc
      AND da.id_docente = t.id_docente
);

-- Sincroniza la carga horaria cuando exista importada.
UPDATE docente_horario_clase h
INNER JOIN tmp_dpcc_destino t ON t.id_aula = h.id_aula
SET h.id_docente = t.id_docente,
    h.dni_docente = t.dni_docente,
    h.docente_nombre = COALESCE(NULLIF(t.docente_nombre, ''), h.docente_nombre),
    h.actualizado_en = NOW()
WHERE h.id_anio_lectivo = @anio_activo
  AND h.id_area = @area_dpcc
  AND h.estado = 1
  AND h.id_docente <> t.id_docente;

-- Conserva registros de transversales: solo cambia el docente si no se genera duplicado.
UPDATE nota_transversal_docente n
INNER JOIN tmp_dpcc_destino t ON t.id_aula = n.id_aula
LEFT JOIN nota_transversal_docente existente
       ON existente.id_periodo_academico = n.id_periodo_academico
      AND existente.id_aula = n.id_aula
      AND existente.id_docente = t.id_docente
      AND existente.id_area_fuente = n.id_area_fuente
      AND existente.id_matricula = n.id_matricula
      AND existente.id_competencia_transversal = n.id_competencia_transversal
SET n.id_docente = t.id_docente,
    n.observacion = TRIM(CONCAT(
        COALESCE(NULLIF(n.observacion, ''), ''),
        CASE WHEN COALESCE(NULLIF(n.observacion, ''), '') = '' THEN '' ELSE ' ' END,
        '[Docente fuente normalizado por parche 059.]'
    )),
    n.actualizado_en = NOW()
WHERE n.id_anio_lectivo = @anio_activo
  AND n.id_area_fuente = @area_dpcc
  AND n.id_docente <> t.id_docente
  AND existente.id_nota_transversal IS NULL;

-- Conserva sesiones del registro auxiliar: solo se actualiza el docente responsable.
UPDATE eval_auxiliar_sesion s
INNER JOIN tmp_dpcc_destino t ON t.id_aula = s.id_aula
SET s.id_docente = t.id_docente,
    s.actualizado_en = NOW()
WHERE s.id_anio_lectivo = @anio_activo
  AND s.id_area = @area_dpcc
  AND s.id_docente IS NOT NULL
  AND s.id_docente <> t.id_docente;

COMMIT;
