package dynamic.joint_degrees;

import dynamic.common.ContentGrabber;
import dynamic.degrees.DegreeHtmlFormatter;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;

public class JointDegreeHtmlFormatter {

    private static BufferedWriter f;

    public static void FormatOutput(String fname, DegreeInfo degree) throws IOException {

        f = new BufferedWriter(new FileWriter(fname));

        f.write(ContentGrabber.content_div_tag_open);
        f.write("<h1>" + degree.name + "</h1>");

        if (degree.years.size() == 1) // one year postgrad degree
            CreateCoursesList(degree,1);
        else {

            int todo = degree.years.size();

            while (todo > 0) {

                if (todo >= 2)
                    CreateTwoColumnBlock(degree, degree.years.size() - todo + 1, degree.years.size() - todo + 2);
                else
                    CreateTwoColumnBlock(degree, degree.years.size() - todo + 1, 0);

                todo -= 2;

            }
        }
        f.write(ContentGrabber.content_div_tag_close);

        f.close();

    }


    private static void CreateTwoColumnBlock(DegreeInfo degree, int year1, int year2) throws IOException {

        f.write("<div class=\"column-wrapper\">");
        f.write("<div class=\"two-col-block\">");
        f.write("<div class=\"col\">");


        if (year1 != 0){
            f.write("<h2>Year " + year1 + "</h2>");
            CreateCoursesList(degree, year1);
        }

        f.write("</div>");
        f.write("<div class=\"col\">");

        if (year2 != 0){
            f.write("<h2>Year " + year2 + "</h2>");
            CreateCoursesList(degree, year2);
        }


        f.write("</div>");
        f.write("<div class=\"clear\"></div>");
        f.write("</div>");
        f.write("</div>");


    }

    private static void CreateCoursesList(DegreeInfo degree, Integer year) throws IOException {

        DegreeYear degreeYear = degree.years.get(year);
        TreeSet<String> requirements = new TreeSet<String>();
        requirements.addAll(degreeYear.courses.keySet());

        for (Iterator<String> iterator = requirements.iterator(); iterator.hasNext(); ) {
            String requirement =  iterator.next();

            if (degreeYear.courses.get(requirement).size() > 0) {
                f.write("<h3>" + requirement + "</h3>");
                CreateCoursesUL(degreeYear.courses.get(requirement));
            }

        }

    }

    private static void CreateCoursesUL(ArrayList<CourseInfo> courses) throws IOException {

        f.write("<ul class=\"link-list\">");

        for (CourseInfo course : courses) {

            String course_id_link = course.code.replaceAll("\\.", "_");  // change e.g. 120.1 to 120_1 for url

            f.write("<li>");
            f.write("<a href=\"" + DegreeHtmlFormatter.link_stub + course_id_link + "\"");
            f.write(" title=\"" + course.code + " " + course.title + "\">" + course.code + " " + course.title + "</a>");
            f.write("</li>");
        }

        f.write("</ul>");

    }

}
