-- Parche 079
-- Formaliza la relacion uno a uno entre la observacion de aula y el Instrumento 2.
-- La observacion es la fuente de comentarios; un mismo Instrumento 2 no puede
-- quedar asociado a mas de una observacion.

SET NAMES utf8mb4;

-- Corrige asociaciones heredadas hacia fichas que no son el Instrumento 2.
UPDATE mon_observacion_aula observacion
LEFT JOIN mon_monitoreo monitoreo
  ON monitoreo.id_monitoreo = observacion.id_monitoreo
LEFT JOIN mon_instrumento instrumento
  ON instrumento.id_instrumento = monitoreo.id_instrumento
SET observacion.id_monitoreo = NULL
WHERE observacion.id_monitoreo IS NOT NULL
  AND (
    monitoreo.id_monitoreo IS NULL
    OR instrumento.id_instrumento IS NULL
    OR instrumento.codigo <> 'DESEMPENO_AULA'
  );

-- Instalaciones antiguas pudieron generar mas de una observacion para la misma
-- ficha. Se conserva la observacion mas reciente y las demas quedan disponibles
-- para una vinculacion manual posterior.
DROP TEMPORARY TABLE IF EXISTS tmp_comano_079_fichas_revisar;
CREATE TEMPORARY TABLE tmp_comano_079_fichas_revisar (
  id_monitoreo INT UNSIGNED NOT NULL,
  PRIMARY KEY (id_monitoreo)
) ENGINE=InnoDB;

INSERT INTO tmp_comano_079_fichas_revisar (id_monitoreo)
SELECT id_monitoreo
FROM mon_observacion_aula
WHERE id_monitoreo IS NOT NULL
GROUP BY id_monitoreo
HAVING COUNT(*) > 1;

DROP TEMPORARY TABLE IF EXISTS tmp_comano_079_vinculo_conservar;
CREATE TEMPORARY TABLE tmp_comano_079_vinculo_conservar (
  id_monitoreo INT UNSIGNED NOT NULL,
  id_observacion INT UNSIGNED NOT NULL,
  PRIMARY KEY (id_monitoreo)
) ENGINE=InnoDB;

INSERT INTO tmp_comano_079_vinculo_conservar (id_monitoreo, id_observacion)
SELECT id_monitoreo,
       CAST(SUBSTRING_INDEX(
         GROUP_CONCAT(
           id_observacion
           ORDER BY (estado = 'COMPLETO') DESC,
                    COALESCE(actualizado_en, creado_en) DESC,
                    id_observacion DESC
           SEPARATOR ','
         ),
         ',',
         1
       ) AS UNSIGNED)
FROM mon_observacion_aula
WHERE id_monitoreo IS NOT NULL
GROUP BY id_monitoreo;

UPDATE mon_observacion_aula observacion
INNER JOIN tmp_comano_079_vinculo_conservar conservar
  ON conservar.id_monitoreo = observacion.id_monitoreo
SET observacion.id_monitoreo = NULL
WHERE observacion.id_observacion <> conservar.id_observacion;

-- Una ficha que tenia fuentes duplicadas debe volver a revisarse: sus niveles,
-- conclusiones y firmas pudieron corresponder a una observacion distinta de la
-- que se acaba de conservar.
UPDATE mon_monitoreo monitoreo
INNER JOIN tmp_comano_079_fichas_revisar revisar
  ON revisar.id_monitoreo = monitoreo.id_monitoreo
SET monitoreo.estado = 'BORRADOR',
    monitoreo.puntaje_total = 0,
    monitoreo.porcentaje_logro = 0,
    monitoreo.nivel_global = NULL,
    monitoreo.fortalezas = NULL,
    monitoreo.aspectos_mejora = NULL,
    monitoreo.acciones_mejora = NULL,
    monitoreo.compromisos_docente = NULL,
    monitoreo.pasos_seguir = NULL,
    monitoreo.recomendaciones_directivas = NULL,
    monitoreo.fecha_seguimiento = NULL,
    monitoreo.observaciones = NULL;

DELETE respuesta
FROM mon_respuesta respuesta
INNER JOIN mon_indicador indicador
  ON indicador.id_indicador = respuesta.id_indicador
INNER JOIN mon_dimension dimension
  ON dimension.id_dimension = indicador.id_dimension
INNER JOIN tmp_comano_079_fichas_revisar revisar
  ON revisar.id_monitoreo = respuesta.id_monitoreo
WHERE dimension.codigo IN ('D1', 'D2', 'D3', 'D4', 'D5');

DELETE archivo
FROM mon_monitoreo_archivo archivo
INNER JOIN tmp_comano_079_fichas_revisar revisar
  ON revisar.id_monitoreo = archivo.id_monitoreo
WHERE archivo.tipo_archivo IN ('FIRMA_DOCENTE', 'FIRMA_MONITOR');

DROP TEMPORARY TABLE IF EXISTS tmp_comano_079_vinculo_conservar;
DROP TEMPORARY TABLE IF EXISTS tmp_comano_079_fichas_revisar;

SET @comano_079_sql := (
  SELECT IF(
    COUNT(*) = 0,
    'ALTER TABLE `mon_observacion_aula` ADD UNIQUE INDEX `uq_observacion_instrumento2` (`id_monitoreo`)',
    'DO 1'
  )
  FROM (
    SELECT s.INDEX_NAME
    FROM information_schema.STATISTICS s
    WHERE s.TABLE_SCHEMA = DATABASE()
      AND s.TABLE_NAME = 'mon_observacion_aula'
      AND s.NON_UNIQUE = 0
    GROUP BY s.INDEX_NAME
    HAVING COUNT(*) = 1
       AND MAX(s.COLUMN_NAME = 'id_monitoreo') = 1
  ) indices_unicos
);
PREPARE comano_079_stmt FROM @comano_079_sql;
EXECUTE comano_079_stmt;
DEALLOCATE PREPARE comano_079_stmt;
