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

import java.io.PrintWriter;
import java.util.List;

import net.sourceforge.fenixedu.domain.Enrolment;
import net.sourceforge.fenixedu.domain.ExecutionYear;
import net.sourceforge.fenixedu.domain.StudentCurricularPlan;
import net.sourceforge.fenixedu.domain.degree.DegreeType;
import net.sourceforge.fenixedu.domain.student.Registration;
import net.sourceforge.fenixedu.domain.student.registrationStates.RegistrationState.RegistrationStateCreator;
import net.sourceforge.fenixedu.domain.student.registrationStates.RegistrationStateType;

import org.joda.time.DateTime;

import pt.utl.ist.scripts.commons.AtomicScript;

public class SetAbandonedState extends AtomicScript {

    private ExecutionYear executionYear;

    @Override
    protected void run() throws Exception {
        PrintWriter writer = null;
        try {
            writer =
                    new PrintWriter(REPORT_DIR_PATH + "/alunos_dfa_sem_inscricoes"
                            + (new DateTime()).toString("_dd_MM_yyyy_hh_mm_ss") + ".csv", "UTF-8");

            executionYear = ExecutionYear.readExecutionYearByName("2010/2011");
            System.out.println(executionYear.getName());

            for (final Registration registration : rootDomainObject.getRegistrationsSet()) {
                final DegreeType degreeType = registration.getDegreeType();
                if (degreeType != null && degreeType.equals(DegreeType.BOLONHA_ADVANCED_FORMATION_DIPLOMA)) {
                    final StudentCurricularPlan activeStudentCurricularPlan = registration.getActiveStudentCurricularPlan();
                    if (activeStudentCurricularPlan != null) {
                        checkActiveSCPEnrolments(activeStudentCurricularPlan, writer);
                    }
                }
            }
        } finally {
            writer.close();
        }
    }

    private void checkActiveSCPEnrolments(StudentCurricularPlan studentCurricularPlan, PrintWriter writer) {

        List<Enrolment> enrolmentsByExecutionYear = studentCurricularPlan.getEnrolmentsByExecutionYear(executionYear);
        if (enrolmentsByExecutionYear.isEmpty()) {
            writer.print(studentCurricularPlan.getRegistration().getStudent().getNumber() + ";");
            writer.print(studentCurricularPlan.getRegistration().getStudent().getName() + ";");
            writer.print(studentCurricularPlan.getRegistration().getDegree().getNameI18N().getContent() + ";");
            writer.print(studentCurricularPlan.getRegistration().getStartExecutionYear().getName() + ";");
            writer.print(studentCurricularPlan.getRegistration().getActiveStateType().getDescription() + ";");

            if (!studentCurricularPlan.getRegistration().isActive()) {
                writer.println("");
                return;
            }

            if (studentCurricularPlan.getRegistration().getStartExecutionYear()
                    .equals(ExecutionYear.readExecutionYearByName("2008/2009"))) {
                DateTime endExecutionYear =
                        ExecutionYear.readExecutionYearByName("2009/2010").getBeginDateYearMonthDay().toDateTimeAtMidnight();

                writer.println(endExecutionYear.toString("dd/MM/yyyy"));
                RegistrationStateCreator.createState(studentCurricularPlan.getRegistration(), null, endExecutionYear,
                        RegistrationStateType.EXTERNAL_ABANDON);
                return;
            }

            if (studentCurricularPlan.getRegistration().getStartExecutionYear()
                    .equals(ExecutionYear.readExecutionYearByName("2009/2010"))) {
                DateTime endExecutionYear =
                        ExecutionYear.readExecutionYearByName("2010/2011").getBeginDateYearMonthDay().toDateTimeAtMidnight();

                writer.println(endExecutionYear.toString("dd/MM/yyyy"));
                RegistrationStateCreator.createState(studentCurricularPlan.getRegistration(), null, endExecutionYear,
                        RegistrationStateType.EXTERNAL_ABANDON);
                return;
            }

            writer.println("");
            return;
        }
    }

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

}
