import argparse

from app.adapters.moodle_academico import (
    obtener_contactos_moodle_connect,
    obtener_cursos_moodle,
    obtener_matriculas_moodle,
)
from app.config import get_settings
from app.database import get_connection
from app.services.sync_academico import (
    sincronizar_cursos,
    sincronizar_matriculas,
)


def main():
    parser = argparse.ArgumentParser(
        description="Sincroniza cursos y matrículas Moodle con DavidHL7 Connect."
    )
    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="Lee y valida los datos sin escribir.",
    )
    args = parser.parse_args()

    settings = get_settings()
    connection = get_connection(settings)

    try:
        contactos = obtener_contactos_moodle_connect(connection, settings)
        moodle_user_ids = [
            int(row["external_user_id"])
            for row in contactos
            if row["external_user_id"] is not None
        ]

        print("======================================")
        print(" DAVIDHL7 CONNECT")
        print(" Moodle -> Cursos y Matrículas")
        print("======================================")
        print(f"Contactos Connect considerados: {len(contactos)}")

        if not moodle_user_ids:
            print("No hay contactos Moodle sincronizados.")
            return

        matriculas = obtener_matriculas_moodle(
            connection,
            settings,
            moodle_user_ids,
        )

        course_ids = {int(m["moodle_course_id"]) for m in matriculas}

        cursos = obtener_cursos_moodle(
            connection,
            settings,
            course_ids,
        )

        cursos_stats = sincronizar_cursos(
            connection,
            settings,
            cursos,
            dry_run=args.dry_run,
        )

        print()
        print("CURSOS")
        print("--------------------------------------")
        print(f"Encontrados:                 {cursos_stats.cursos_encontrados}")
        print(f"Insertados:                  {cursos_stats.cursos_insertados}")
        print(f"Actualizados:                {cursos_stats.cursos_actualizados}")

        if args.dry_run:
            print()
            print("MATRÍCULAS")
            print("--------------------------------------")
            print(f"Encontradas en Moodle:       {len(matriculas)}")
            print("MODO PRUEBA: no se escribió ningún dato.")
            return

        matriculas_stats = sincronizar_matriculas(
            connection,
            settings,
            matriculas,
            dry_run=False,
        )

        print()
        print("MATRÍCULAS")
        print("--------------------------------------")
        print(f"Encontradas:                 {matriculas_stats.matriculas_encontradas}")
        print(f"Insertadas:                  {matriculas_stats.matriculas_insertadas}")
        print(f"Actualizadas:                {matriculas_stats.matriculas_actualizadas}")
        print(f"Omitidas:                    {matriculas_stats.matriculas_omitidas}")
        print(f"Con último acceso:           {matriculas_stats.con_ultimo_acceso}")
        print(f"Finalizadas:                 {matriculas_stats.finalizadas}")
        print("--------------------------------------")
        print("Sincronización académica completada.")

    finally:
        connection.close()


if __name__ == "__main__":
    main()
