import 'jest-extended'
import { superagent, serverAPI } from '../../src/utils/define';
import { CoursControlleur } from '../../src/controleurs/coursControleur';
import { Enseignant } from '../../src/classes/enseignant';

import courseAllMockResponse from '../mocks/responses/course-all.json';
import scheduleAllMockResponse from '../mocks/responses/schedule-all.json';
import studentAllMockResponse from '../mocks/responses/student-all.json';
import studentGroupStudentMockResponse from '../mocks/responses/student-groupstudent.json';

import mocker from 'superagent-mocker';
mocker.timeout = 50;
const superagentMock = mocker(superagent);

const vincentLacasse = new Enseignant(
    'cc-vincent.lacasse@etsmtl.ca',
    'Vincent',
    'Lacasse',
    'abc123'
);

describe('Cours contrôleur intialiser', () => {
    let coursControlleur: CoursControlleur;

    beforeEach(() => {
        coursControlleur = new CoursControlleur();
    });

    afterEach(() => {
        superagentMock.clearRoutes();
    });


    it('devrait initialiser des cours dans la liste initiale', async () => {
        superagentMock.get(`http://${serverAPI}/api/v3/course/all`, () => courseAllMockResponse);
        superagentMock.get(`http://${serverAPI}/api/v3/schedule/all`, () => scheduleAllMockResponse);
        superagentMock.get(`http://${serverAPI}/api/v3/student/all`, () => studentAllMockResponse);
        superagentMock.get(`http://${serverAPI}/api/v3/student/groupstudent`, () => studentGroupStudentMockResponse);

        var vincentLacasseCours = coursControlleur.recupererCours(vincentLacasse);
        

        await expect(vincentLacasseCours.length).toBe(0);

        await coursControlleur.init();

        vincentLacasseCours = coursControlleur.recupererCours(vincentLacasse);

        await expect(vincentLacasseCours.length).toBe(1);
        await expect(vincentLacasseCours[0].horaire_cours.length).toBe(2);
    });
});

describe('cours contrôleur CRUD', () => {
    const coursControlleur: CoursControlleur = new CoursControlleur();
    
    beforeEach(async () => {
        superagentMock.get(`http://${serverAPI}/api/v3/course/all`, () => courseAllMockResponse);
        superagentMock.get(`http://${serverAPI}/api/v3/schedule/all`, () => scheduleAllMockResponse);
        superagentMock.get(`http://${serverAPI}/api/v3/student/all`, () => studentAllMockResponse);
        superagentMock.get(`http://${serverAPI}/api/v3/student/groupstudent`, () => studentGroupStudentMockResponse);
        await coursControlleur.init();
    });

    afterAll(() => {
        superagentMock.clearRoutes();
    });
  
  
    it('devrait s\'assurer que ajouterCours rend le cours actif dans SGA',async () => {
        let group_id_to_add = scheduleAllMockResponse.body.data[0].group_id;

        const coursBeforeActif = coursControlleur.recupererCoursDetails(group_id_to_add)?.actif;
        
        coursControlleur.ajouterCours(group_id_to_add);

        const coursAfter = coursControlleur.recupererCoursDetails(group_id_to_add);
        
        expect(coursBeforeActif).toBe(false);
        expect(coursAfter?.actif).toBe(true);
    });

    it('devrait s\'assurer que retirerCours rend le cours inactif dans SGA',async () => {
        let group_id_to_add = scheduleAllMockResponse.body.data[0].group_id;

        coursControlleur.ajouterCours(group_id_to_add);

        const coursBeforeActif = coursControlleur.recupererCoursDetails(group_id_to_add)?.actif;
        
        coursControlleur.retirerCours(group_id_to_add);

        const coursAfter = coursControlleur.recupererCoursDetails(group_id_to_add);
        
        await expect(coursBeforeActif).toBe(true);
        await expect(coursAfter?.actif).toBe(false);
    });

    it('devrait s\'assurer que recupererCours retourne la liste de tous les cours d\'un utilisateur', async () => {
        let group_id_to_add = "S20213-LOG121-02";
      
        const vincentLacasseCoursList = coursControlleur.recupererCours(vincentLacasse);

        await expect(vincentLacasseCoursList?.length).toBe(1);

        const cours = vincentLacasseCoursList[0];

        await expect(cours?.actif).toBe(false);
        await expect(cours?.group_id).toBe(group_id_to_add);
        await expect(cours?.prealable).toBe("none");
        await expect(cours?.titre).toBe("Conception orientée object");
        await expect(cours?.horaire_cours.length).toBe(2);

        await expect(cours?.horaire_cours[0].jours).toBe(scheduleAllMockResponse.body.data[2].day);
        await expect(cours?.horaire_cours[0].heures).toBe(scheduleAllMockResponse.body.data[2].hours);
        await expect(cours?.horaire_cours[0].activite).toBe(scheduleAllMockResponse.body.data[2].activity);
    });

    it('devrait s\'assurer que recupererCoursDetails retourne le cours avec détails', async () => {
        let group_id_to_add = scheduleAllMockResponse.body.data[0].group_id;
      
        const cours = coursControlleur.recupererCoursDetails(group_id_to_add);

        await expect(cours?.actif).toBe(false);
        await expect(cours?.group_id).toBe(group_id_to_add);
        await expect(cours?.prealable).toBe("none");
        await expect(cours?.titre).toBe("Conception orientée object");
        await expect(cours?.horaire_cours.length).toBe(2);
        await expect(cours?.horaire_cours[0].jours).toBe(scheduleAllMockResponse.body.data[0].day);
        await expect(cours?.horaire_cours[0].heures).toBe(scheduleAllMockResponse.body.data[0].hours);
        await expect(cours?.horaire_cours[0].activite).toBe(scheduleAllMockResponse.body.data[0].activity);
    });
  })