package pt.utl.ist.scripts.runOnce;

import java.util.Iterator;
import java.util.List;

import net.sourceforge.fenixedu.domain.CurricularCourse;
import net.sourceforge.fenixedu.domain.Degree;
import net.sourceforge.fenixedu.domain.DegreeCurricularPlan;
import net.sourceforge.fenixedu.domain.degreeStructure.Context;
import net.sourceforge.fenixedu.domain.degreeStructure.CourseGroup;
import pt.ist.fenixframework.core.AbstractDomainObject;
import pt.utl.ist.scripts.commons.AtomicScript;

public class InitializeOrderToContextsOfDegreeModules extends AtomicScript {

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

    @Override
    protected void run() throws Exception {
        // orderBolonhaDegreeCurricularPlans();
        orderDegreeCurricularPlan(DegreeCurricularPlan.readByNameAndDegreeSigla("MEAmbi 2008", "MEAmbi"));
    }

    private void orderBolonhaDegreeCurricularPlans() {
        for (final Degree bolonhaDegree : Degree.readBolonhaDegrees()) {
            for (final DegreeCurricularPlan dcp : bolonhaDegree.getDegreeCurricularPlans()) {
                if (dcp.isBolonhaDegree()) {
                    orderDegreeCurricularPlan(dcp);
                }
            }
        }
    }

    private void orderDegreeCurricularPlan(final DegreeCurricularPlan dcp) {
        logger.info("");
        logger.info("=====================================================================================");
        logger.info("[DCP][ID]=" + dcp.getExternalId() + ", [NAME]=" + dcp.getName());
        logger.info(dcp.print());

        setOrderOnContexts(dcp.getRoot(), CurricularCourse.class);
        setOrderOnContexts(dcp.getRoot(), CourseGroup.class);
    }

    private void setOrderOnContexts(CourseGroup courseGroup, Class<? extends AbstractDomainObject> name) {
        List<Context> contexts = null;
        if (name.equals(CurricularCourse.class)) {
            contexts = courseGroup.getSortedChildContextsWithCurricularCourses();
        } else if (name.equals(CourseGroup.class)) {
            contexts = courseGroup.getSortedChildContextsWithCourseGroups();
        }

        if (contexts.isEmpty()) {
            return;
        }

        Iterator<Context> iter = contexts.iterator();
        Context context = null;
        for (int order = 0; iter.hasNext(); order++) {
            context = iter.next();
            context.setChildOrder(order);

            if (!context.getChildDegreeModule().isLeaf()) {
                setOrderOnContexts((CourseGroup) context.getChildDegreeModule(), CurricularCourse.class);
                setOrderOnContexts((CourseGroup) context.getChildDegreeModule(), CourseGroup.class);
            }
        }

        logger.info("");
        logger.info("orders set for contexts with " + name.getSimpleName() + " for [CourseGroup][ID]="
                + courseGroup.getExternalId() + ", [NAME]=" + courseGroup.getName());
        for (Context verify : contexts) {
            logger.info("[Context][ID]=" + verify.getExternalId() + ", [DEGREE_MODULE]="
                    + verify.getChildDegreeModule().getName() + ", [ORDER]=" + verify.getChildOrder());
        }
    }

}
