import { Questionnaire } from "../classes/questionnaire";
import { questionControleur } from "../locator";
import { Question } from "../classes/question";

export class QuestionnaireControleur {

    private _questionnaires: Map<string, Questionnaire>;
    
    constructor() {
        this._questionnaires = new Map<string, Questionnaire>();
    }

    public recupererQuestionnaires() {
        return this._questionnaires;
    }

    public getNbQuestionnairesParCours(cours: string): number {
        let questionnaireCounter: number = 0;

        this._questionnaires.forEach((val, key) => {
            if(val._cours === cours)
                questionnaireCounter++;
        });

        return questionnaireCounter;
    }

    public getNbQuestionnairesEnseignantParCours(cours: string, user_id: string): number {
        let questionnaireCounter: number = 0;

        this._questionnaires.forEach((val, key) => {
            if(val._cours === cours && val._enseignant === user_id)
                questionnaireCounter++;
        });

        return questionnaireCounter;
    }

    public getNbDeFoisQuestionUtilisee(questionOriginale: Question) {
        let counter = 0;

        this._questionnaires.forEach((questionnaire) => {
            questionnaire._questions.forEach((question) => {
                if(question === questionOriginale) {
                    counter++;
                }
            });
        });

        return counter;
    }

    public recupererQuestionnaire(nom: string) {
        return this._questionnaires.get(nom);
    }

    public ajouterQuestionnaire(enseignant: string, cours: string, nom: string, description: string, etat: boolean): string {
        if (this.isEmpty(nom)) {
            throw new Error("Le nom du questionnaire ne peut pas etre vide");
        }

        if (this._questionnaires.get(nom)) {
            throw new Error(`Le questionnaire ${nom} existe déjà`);
        }
        
        const questionnaire = new Questionnaire(enseignant, cours, nom, description, etat);
        this._questionnaires.set(nom, questionnaire);

        return JSON.stringify(questionnaire);
    }

    public isEmpty(str: string): boolean{
        return str === null || str.length === 0 || str.match(/^ *$/) !== null;
    }

    public modifierQuestionnaire(enseignant: string, cours: string, nom: string, description: string, etat: boolean, questionAssocier: string,  questionDissocier: string, ordreQuestion: string[]): Questionnaire {
        // TODO 
        const questionnaire = this._questionnaires.get(nom)

        if (!questionnaire) {
            throw new Error(`Pas de questionnaire trouvé pour: ${nom}`);
        }

        questionnaire._description = description
        questionnaire._etat = etat
        
        // TODO ajouter les questions
        questionnaire.reordonner(ordreQuestion)
        
        const questionAs = questionControleur.recupererQuestion(questionAssocier, enseignant)
        if(questionAs !== null)
            questionnaire.ajouterQuestion(questionAs)

        const questionDis = questionControleur.recupererQuestion(questionDissocier, enseignant)
        if(questionDis !== null)
            questionnaire.retirerQuestion(questionDis)
        
        return questionnaire;
    }

    public supprimerQuestionnaire(enseignant: string, cours: string, nom: string): boolean {
        if (!this._questionnaires.get(nom)) {
            throw new Error(`Pas de questionnaire trouvé pour: ${nom}`);
        }
        if (this._questionnaires.get(nom)._questionnaireRemis) {
            return false
        }
        
        this._questionnaires.delete(nom);
        
        return true;
    }
}