package pt.utl.ist.scripts.process.updateData;

import net.sourceforge.fenixedu.domain.Enrolment;
import net.sourceforge.fenixedu.domain.EnrolmentEvaluation;
import net.sourceforge.fenixedu.domain.ExecutionSemester;
import net.sourceforge.fenixedu.domain.curriculum.EnrolmentEvaluationType;
import net.sourceforge.fenixedu.util.EnrolmentEvaluationState;
import pt.ist.fenixframework.FenixFramework;
import pt.utl.ist.scripts.commons.AtomicScript;

public class CheckImprovementEnrolmentEvaluations extends AtomicScript {

    @Override
    protected void run() throws Exception {
        ExecutionSemester executionPeriod = ExecutionSemester.readActualExecutionSemester();
        ExecutionSemester finalExecutionPeriod = FenixFramework.getDomainObject("3856880631889");
//                rootDomainObject.readExecutionSemesterByOID(81);
        while (executionPeriod != null) {
            logger.info(" ----------- Inicio Periodo " + executionPeriod.getName() + " "
                    + executionPeriod.getExecutionYear().getYear() + " ------------------");
            doAction(new CheckImprovementEnrolmentEvaluationsByPeriod(executionPeriod));
            logger.info(" ----------- Fim Periodo " + executionPeriod.getName() + " "
                    + executionPeriod.getExecutionYear().getYear() + " ------------------");
            if (executionPeriod == finalExecutionPeriod) {
                executionPeriod = null;
            } else {
                executionPeriod = executionPeriod.getPreviousExecutionPeriod();
            }
        }

    }

    private static class CheckImprovementEnrolmentEvaluationsByPeriod extends AtomicProcedure {

        ExecutionSemester executionPeriod;
        int i = 0;

        public CheckImprovementEnrolmentEvaluationsByPeriod(ExecutionSemester executionPeriod) {
            this.executionPeriod = executionPeriod;
        }

        @Override
        public void proc() throws Exception {
            for (Enrolment enrolment : executionPeriod.getEnrolmentsSet()) {
                processEnrolment(enrolment);
            }
            logger.info("" + i);
        }

        private void processEnrolment(Enrolment enrolment) {
            EnrolmentEvaluation enrolmentEvaluation = null;
            EnrolmentEvaluation wrongEnrolmentEvaluation = null;
            for (EnrolmentEvaluation evaluation : enrolment.getEvaluationsSet()) {
                if (evaluation.getEnrolmentEvaluationType() == EnrolmentEvaluationType.IMPROVEMENT && evaluation.hasMarkSheet()) {
                    enrolmentEvaluation = evaluation;
                } else if (evaluation.getEnrolmentEvaluationType() == EnrolmentEvaluationType.IMPROVEMENT
                        && !evaluation.hasMarkSheet()
                        && evaluation.getEnrolmentEvaluationState().equals(EnrolmentEvaluationState.FINAL_OBJ)) {
                    wrongEnrolmentEvaluation = evaluation;
                }
            }

            if (enrolmentEvaluation != null && wrongEnrolmentEvaluation != null) {
                logger.info(enrolmentEvaluation.getEnrolment().getExternalId() + " -> "
                        + wrongEnrolmentEvaluation.getExternalId());
                wrongEnrolmentEvaluation.setEnrolmentEvaluationState(EnrolmentEvaluationState.TEMPORARY_OBJ);
                wrongEnrolmentEvaluation.delete();
                i++;
            }
        }
    }

    public static void main(String[] args) {
        process(new CheckImprovementEnrolmentEvaluations());
        System.exit(0);
    }

}
