##############################################################################
# ScoDoc
# Copyright (c) 1999 - 2024 Emmanuel Viennet.  All rights reserved.
# See LICENSE
##############################################################################

""" Test lecture/érciture fichiers Apogée

"""

import pytest
from flask import g

import app
from app import db
from app.models import Formation, FormSemestreEtape
from app.scodoc import sco_apogee_csv, sco_apogee_reader
from config import TestConfig
from tests.conftest import RESOURCES_DIR
from tests.unit import yaml_setup


DEPT = TestConfig.DEPT_TEST
APO_CSV_FILE = RESOURCES_DIR + "/apogee/V1RET!117.txt"


def test_apogee_csv(test_client):
    """Lecture/écriture d'un fichier Apogée: vérifie que le fichier écrit est
    strictement identique au fichier lu.
    (le semestre n'ayant aucun résultat)
    """
    app.set_sco_dept(DEPT)
    # Met en place une formation et un semestre
    formation = Formation(
        dept_id=g.scodoc_dept_id,
        acronyme="TESTAPO",
        titre="Test Apo",
        titre_officiel="Test Apof",
    )
    db.session.add(formation)
    formsemestre = yaml_setup.create_formsemestre(
        formation, [], 1, "S1_apo", "2021-09-01", "2022-01-15"
    )
    etape = FormSemestreEtape(etape_apo="V1RET!117")
    formsemestre.etapes.append(etape)
    db.session.add(formsemestre)
    db.session.commit()
    #
    with open(APO_CSV_FILE, encoding=sco_apogee_reader.APO_INPUT_ENCODING) as f:
        data = f.read()
    assert "ETUDIANT" in data
    #
    apo_data = sco_apogee_csv.ApoData(data, periode=2)
    apo_data.setup()
    assert len(apo_data.apo_csv.csv_etuds) == 2
    apo_etuds = apo_data.etud_by_nip.values()
    for apo_etud in apo_etuds:
        apo_etud.is_apc = apo_data.is_apc
        apo_etud.lookup_scodoc(apo_data.etape_formsemestre_ids)
        apo_etud.associate_sco(apo_data)
    data_2 = (
        apo_data.apo_csv.write(apo_etuds)
        .decode(sco_apogee_reader.APO_INPUT_ENCODING)
        .replace("\r", "")
    )
    # open("toto.txt", "w", encoding=sco_apogee_reader.APO_INPUT_ENCODING).write(data_2)
    assert data == data_2