-- Parche 064
-- Programaciones docentes: agrega alcance por SECCION/GRADO y numero de unidad.
-- Permite que un docente que cubre todas las secciones de un grado suba un solo
-- documento para todo el grado; cuando las secciones son atendidas por docentes
-- diferentes, el registro continua siendo por seccion.

START TRANSACTION;

SET @sql := (
    SELECT IF(COUNT(*) = 0,
        'ALTER TABLE docente_programacion_archivo ADD COLUMN alcance ENUM("SECCION","GRADO") NOT NULL DEFAULT "SECCION" AFTER id_area',
        'SELECT 1'
    )
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = 'docente_programacion_archivo'
      AND COLUMN_NAME = 'alcance'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @sql := (
    SELECT IF(COUNT(*) = 0,
        'ALTER TABLE docente_programacion_archivo ADD COLUMN id_nivel CHAR(3) NULL AFTER alcance',
        'SELECT 1'
    )
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = 'docente_programacion_archivo'
      AND COLUMN_NAME = 'id_nivel'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @sql := (
    SELECT IF(COUNT(*) = 0,
        'ALTER TABLE docente_programacion_archivo ADD COLUMN id_grado TINYINT UNSIGNED NULL AFTER id_nivel',
        'SELECT 1'
    )
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = 'docente_programacion_archivo'
      AND COLUMN_NAME = 'id_grado'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @sql := (
    SELECT IF(COUNT(*) = 0,
        'ALTER TABLE docente_programacion_archivo ADD COLUMN unidad_numero TINYINT UNSIGNED NULL AFTER tipo',
        'SELECT 1'
    )
    FROM information_schema.COLUMNS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = 'docente_programacion_archivo'
      AND COLUMN_NAME = 'unidad_numero'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

UPDATE docente_programacion_archivo pa
INNER JOIN aula a ON a.id_aula = pa.id_aula
SET pa.id_nivel = COALESCE(pa.id_nivel, a.id_nivel),
    pa.id_grado = COALESCE(pa.id_grado, a.id_grado),
    pa.alcance = COALESCE(pa.alcance, 'SECCION')
WHERE pa.id_nivel IS NULL
   OR pa.id_grado IS NULL
   OR pa.alcance IS NULL;

SET @sql := (
    SELECT IF(COUNT(*) = 0,
        'ALTER TABLE docente_programacion_archivo ADD KEY idx_doc_prog_scope (id_anio_lectivo, id_docente, alcance, id_nivel, id_grado, id_area, tipo, estado)',
        'SELECT 1'
    )
    FROM information_schema.STATISTICS
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = 'docente_programacion_archivo'
      AND INDEX_NAME = 'idx_doc_prog_scope'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

COMMIT;

SELECT 'Parche 064 aplicado: programaciones docentes con alcance y unidad.' AS resultado;
