package logica.reportes;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.extended.NamedMapConverter;
import logica.Search;
import org.json.XML;
import orm.*;

import javax.xml.transform.TransformerException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.HashMap;

/**
 * Clase generadora de reportes, inicia, configura y genera el reporte requerido
 * los guarda en xml, json, docx, xlsx y html
 * @deprecated Ya no se utiliza :3 se usan las clases de los reportes directamente
 */
public class Reporte {

    private File xslPath;

    public Reporte(File xslPath) {
        this.xslPath = xslPath;
    }

    public File getXslPath() {
        return xslPath;
    }

    public void setXslPath(File xslPath) {
        this.xslPath = xslPath;
    }

    /**
     * Inicia XStream con propiedades deseadas, para no mostrar datos innecesarios de las clases y asignarles alias a las clases para no mostrar las rutas completas de estas.
     *
     * @param xstream Instancia de XStream a modificar.
     */
    public void setXStream(XStream xstream) {
        xstream.alias("Actividad", Actividad.class);
        xstream.alias("Anotacion", Anotacion.class);
        xstream.alias("Apoderado", Apoderado.class);
        xstream.alias("Asignatura", Asignatura.class);
        xstream.alias("Asistencia", Asistencia.class);
        xstream.alias("Colegio", Colegio.class);
        xstream.alias("Curso", Curso.class);
        xstream.alias("Estudiante", Estudiante.class);
        xstream.alias("Nota", Nota.class);
        xstream.alias("Profesor", Profesor.class);

        xstream.omitField(Actividad.class, "id_pk");
        xstream.omitField(Actividad.class, "_ormAdapter");

        xstream.omitField(Anotacion.class, "id_pk");
        xstream.omitField(Anotacion.class, "_ormAdapter");

        xstream.omitField(Apoderado.class, "id_pk");
        xstream.omitField(Apoderado.class, "colegio_id_fk");
        xstream.omitField(Apoderado.class, "ORM_estudiante");
        xstream.omitField(Apoderado.class, "_ormAdapter");
        xstream.omitField(Apoderado.class, "estudiante");

        xstream.omitField(Asignatura.class, "id_pk");
        xstream.omitField(Asignatura.class, "_ormAdapter");
        xstream.omitField(Asignatura.class, "ORM_actividad");
        xstream.omitField(Asignatura.class, "ORM_nota");
        xstream.omitField(Asignatura.class, "actividad");
        xstream.omitField(Asignatura.class, "nota");

        xstream.omitField(Asistencia.class, "id_pk");
        xstream.omitField(Asistencia.class, "_ormAdapter");

        xstream.omitField(Colegio.class, "id_pk");
        xstream.omitField(Colegio.class, "_ormAdapter");
        xstream.omitField(Colegio.class, "ORM_curso");
        xstream.omitField(Colegio.class, "ORM_apoderado");
        xstream.omitField(Colegio.class, "ORM_profesor");
        xstream.omitField(Colegio.class, "curso");
        xstream.omitField(Colegio.class, "apoderado");
        xstream.omitField(Colegio.class, "profesor");

        xstream.omitField(Curso.class, "id_pk");
        xstream.omitField(Curso.class, "_ormAdapter");
        xstream.omitField(Curso.class, "ORM_asignatura");
        xstream.omitField(Curso.class, "ORM_estudiante");
        xstream.omitField(Curso.class, "asignatura");
        xstream.omitField(Curso.class, "estudiante");

        xstream.omitField(Estudiante.class, "id_pk");
        xstream.omitField(Estudiante.class, "_ormAdapter");
        xstream.omitField(Estudiante.class, "ORM_anotacion");
        xstream.omitField(Estudiante.class, "ORM_nota");
        xstream.omitField(Estudiante.class, "ORM_asistencia");
        xstream.omitField(Estudiante.class, "anotacion");
        xstream.omitField(Estudiante.class, "nota");
        xstream.omitField(Estudiante.class, "asistencia");

        xstream.omitField(Nota.class, "id_pk");
        xstream.omitField(Nota.class, "_ormAdapter");

        xstream.omitField(Profesor.class, "id_pk");
        xstream.omitField(Profesor.class, "_ormAdapter");
        xstream.omitField(Profesor.class, "ORM_asignatura");
        xstream.omitField(Profesor.class, "ORM_anotacion");
        xstream.omitField(Profesor.class, "asignatura");
        xstream.omitField(Profesor.class, "anotacion");

    }


    /**
     * Genera el reporte de notas de los alumnos en la asignatura que imparte un profesor
     *
     * @param profesor El profesor del cual se quiere sacar la informacion.
     */
    public void reporteNotasProfesor(File reportesPath, String html, String xlsx, String docx, Profesor profesor) {
        XStream xstream = new XStream();
        setXStream(xstream);
        xstream.setMode(XStream.NO_REFERENCES);

        ReporteNotasProfesor reporte = new ReporteNotasProfesor(profesor);

        String xml = xstream.toXML(reporte);
        String json = XML.toJSONObject(xml).toString();
        try {
            PrintWriter outXml = new PrintWriter(reportesPath.getPath() + "/" + profesor.getRut() + "-NotasProfesor.xml");
            outXml.println(xml);
            outXml.close();
            PrintWriter outJson = new PrintWriter(reportesPath.getPath() + "/" + profesor.getRut() + "-NotasProfesor.json");
            outJson.println(json);
            outJson.close();

            if(html!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toHtmlNotasProfesor.xsl",
                        reportesPath.getPath() + "/" + profesor.getRut() + "-NotasProfesor.xml",
                        reportesPath.getPath() + "/" + html + ".html"
                );
            }
            if(xlsx!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toExcelNotasProfesor.xsl",
                        reportesPath.getPath() + "/" + profesor.getRut() + "-NotasProfesor.xml",
                        reportesPath.getPath() + "/" + xlsx + ".xlsx"
                );
            }
            if(docx!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toWordNotasProfesor.xsl",
                        reportesPath.getPath() + "/" + profesor.getRut() + "-NotasProfesor.xml",
                        reportesPath.getPath() + "/" + docx + ".docx"
                );
            }
        } catch (FileNotFoundException | TransformerException e) {
            e.printStackTrace();
        }
    }

    /**
     * Genera el reporte de planificaciones de los alumnos de un apoderado
     *
     * @param apoderado Apoderado al cual pertence los estudiantes
     */
    public void reportePlanificaciones(File reportesPath, String html, String xlsx, String docx, Apoderado apoderado) {
        XStream xstream = new XStream();
        setXStream(xstream);
        xstream.setMode(XStream.NO_REFERENCES);

        ReportePlanificaciones reporte = new ReportePlanificaciones(apoderado);

        String xml = xstream.toXML(reporte);
        String json = XML.toJSONObject(xml).toString();
        try {
            PrintWriter outXml = new PrintWriter(reportesPath.getPath() + "/" + apoderado.getRut() + "-Planificaciones.xml");
            outXml.println(xml);
            outXml.close();
            PrintWriter outJson = new PrintWriter(reportesPath.getPath() + "/" + apoderado.getRut() + "-Planificaciones.json");
            outJson.println(json);
            outJson.close();
            if(html!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toHtmlPlanificaciones.xsl",
                        reportesPath.getPath() + "/" + apoderado.getRut() + "-Planificaciones.xml",
                        reportesPath.getPath() + "/" + html + ".html"
                );
            }
            if(xlsx!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toExcelPlanificaciones.xsl",
                        reportesPath.getPath() + "/" + apoderado.getRut() + "-Planificaciones.xml",
                        reportesPath.getPath() + "/" + xlsx + ".xlsx"
                );
            }
            if(docx!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toWordPlanificaciones.xsl",
                        reportesPath.getPath() + "/" + apoderado.getRut() + "-Planificaciones.xml",
                        reportesPath.getPath() + "/" + docx + ".docx"
                );
            }
        } catch (FileNotFoundException | TransformerException e) {
            e.printStackTrace();
        }

    }

    /**
     * Genera el reporte que muestra los alumnos que estan reprobando en el colegio
     */
    public void reporteReprobado(File reportesPath, String html, String xlsx, String docx) {
        XStream xstream = new XStream();
        setXStream(xstream);
        xstream.setMode(XStream.NO_REFERENCES);

        ReporteReprobando reporte = new ReporteReprobando();

        String xml = xstream.toXML(reporte);
        String json = XML.toJSONObject(xml).toString();
        try {
            PrintWriter outXml = new PrintWriter(reportesPath.getPath() + "/reporteReprobado.xml");
            outXml.println(xml);
            outXml.close();
            PrintWriter outJson = new PrintWriter(reportesPath.getPath() + "/reporteReprobado.json");
            outJson.println(json);
            outJson.close();
            if(html!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toHtmlReprobando.xsl",
                        reportesPath.getPath() + "/reporteReprobado.xml",
                        reportesPath.getPath() + "/"+html+".html"
                );
            }
            if(xlsx!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toExcelReprobando.xsl",
                        reportesPath.getPath() + "/reporteReprobado.xml",
                        reportesPath.getPath() + "/"+xlsx+".xlsx"
                );
            }
            if(docx!=null) {
                XslTransformer.transform(
                        xslPath.getPath() + "/toWordReprobando.xsl",
                        reportesPath.getPath() + "/reporteReprobado.xml",
                        reportesPath.getPath() + "/"+docx+".docx"
                );
            }
        } catch (FileNotFoundException | TransformerException e) {
            e.printStackTrace();
        }
    }
}
