package logica.reportes;

import logica.ExNihilo;
import logica.Search;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import orm.Apoderado;
import orm.Estudiante;
import orm.Profesor;

import java.io.File;
import java.util.HashMap;

import static org.junit.Assert.*;

public class ReportesTest {
    @BeforeClass
    public static void before() {
        ExNihilo.deleteAll();
        ExNihilo.fill();
    }

    @Test
    public void reporteApoderado() {
        HashMap<String, String> reportes = ReporteApoderado.generar(new File("files/xslt"), true, true, true, true, true);
        assertNotNull(reportes);
        assertEquals(5, reportes.size());
        assertNotNull(reportes.get("xml"));
        assertNotNull(reportes.get("json"));
        assertNotNull(reportes.get("html"));
        assertNotNull(reportes.get("xlsx"));
        assertNotNull(reportes.get("docx"));
        assertTrue(new File("files/reportes/reporteApoderado/reporteGeneral.xml").exists());
        assertTrue(new File("files/reportes/reporteApoderado/reporteGeneral.json").exists());
        assertTrue(new File("files/reportes/reporteApoderado/reporteGeneral.html").exists());
        assertTrue(new File("files/reportes/reporteApoderado/reporteGeneral.xlsx").exists());
        assertTrue(new File("files/reportes/reporteApoderado/reporteGeneral.docx").exists());
    }

    @Test
    public void reporteApoderadoMasEstudiantes() {
        ReporteApoderadosMasEstudiantes rame = new ReporteApoderadosMasEstudiantes();
        HashMap<String, String> reportes = rame.generar(new File("files/xslt"), true, true, true, true, true);
        assertNotNull(reportes);
        assertEquals(5, reportes.size());
        assertNotNull(reportes.get("xml"));
        assertNotNull(reportes.get("json"));
        assertNotNull(reportes.get("html"));
        assertNotNull(reportes.get("xlsx"));
        assertNotNull(reportes.get("docx"));
        assertTrue(new File("files/reportes/reporteApoderadosMasEstudiantes/reporteApoderadosMasEstudiantes.xml").exists());
        assertTrue(new File("files/reportes/reporteApoderadosMasEstudiantes/reporteApoderadosMasEstudiantes.json").exists());
        assertTrue(new File("files/reportes/reporteApoderadosMasEstudiantes/reporteApoderadosMasEstudiantes.html").exists());
        assertTrue(new File("files/reportes/reporteApoderadosMasEstudiantes/reporteApoderadosMasEstudiantes.xlsx").exists());
        assertTrue(new File("files/reportes/reporteApoderadosMasEstudiantes/reporteApoderadosMasEstudiantes.docx").exists());
    }

    @Test
    public void reporteAsistenciaBaja() {
        ReporteAsistenciaBajo rab = new ReporteAsistenciaBajo(100);
        HashMap<String, String> reportes = rab.generar(new File("files/xslt"), true, true, true, true, true);
        assertNotNull(reportes);
        assertEquals(5, reportes.size());
        assertNotNull(reportes.get("xml"));
        assertNotNull(reportes.get("json"));
        assertNotNull(reportes.get("html"));
        assertNotNull(reportes.get("xlxs"));
        assertNotNull(reportes.get("docx"));
        assertTrue(new File("files/reportes/reporteBajaAsistencia/reporteAsistenciaBajo.xml").exists());
        assertTrue(new File("files/reportes/reporteBajaAsistencia/reporteAsistenciaBajo.json").exists());
        assertTrue(new File("files/reportes/reporteBajaAsistencia/reporteAsistenciaBajo.html").exists());
        assertTrue(new File("files/reportes/reporteBajaAsistencia/reporteAsistenciaBajo.xlsx").exists());
        assertTrue(new File("files/reportes/reporteBajaAsistencia/reportesAsistenciaBajo.docx").exists());
    }

    @Test
    public void reporteAsistenciaYNotas() {
        Estudiante estudiante = Search.buscarEstudiantes()[0];
        ReporteAsistenciaYNotas rayn = new ReporteAsistenciaYNotas(Search.buscarEstudiantes()[0]);
        HashMap<String, String> reportes = rayn.generar(new File("files/xslt"), true, true, true, true, true);
        assertNotNull(reportes);
        assertEquals(5, reportes.size());
        assertNotNull(reportes.get("xml"));
        assertNotNull(reportes.get("json"));
        assertNotNull(reportes.get("html"));
        assertNotNull(reportes.get("xlsx"));
        assertNotNull(reportes.get("docx"));
        assertTrue(new File("files/reportes/reporteAsistenciaYNotas/" + estudiante.getRut() + "-AsistenciaYNotas.xml").exists());
        assertTrue(new File("files/reportes/reporteAsistenciaYNotas/" + estudiante.getRut() + "-AsistenciaYNotas.json").exists());
        assertTrue(new File("files/reportes/reporteAsistenciaYNotas/" + estudiante.getRut() + "-AsistenciaYNotas.html").exists());
        assertTrue(new File("files/reportes/reporteAsistenciaYNotas/" + estudiante.getRut() + "-AsistenciaYNotas.xlsx").exists());
        assertTrue(new File("files/reportes/reporteAsistenciaYNotas/" + estudiante.getRut() + "-AsistenciaYNotas.docx").exists());
    }

    @Test
    public void reporteNotasProfesor() {
        Profesor profesor = Search.buscarProfesores()[0];
        ReporteNotasProfesor rnp = new ReporteNotasProfesor(profesor);
        HashMap<String, String> reportes = rnp.generar(new File("files/xslt"), true, true, true, true, true);
        assertNotNull(reportes);
        assertEquals(5, reportes.size());
        assertNotNull(reportes.get("xml"));
        assertNotNull(reportes.get("json"));
        assertNotNull(reportes.get("html"));
        assertNotNull(reportes.get("xslx"));
        assertNotNull(reportes.get("docx"));
        assertTrue(new File("files/reportes/reporteNotasProfesor/" + profesor.getRut() + "-NotasProfesor.xml").exists());
        assertTrue(new File("files/reportes/reporteNotasProfesor/" + profesor.getRut() + "-NotasProfesor.xml").exists());
        assertTrue(new File("files/reportes/reporteNotasProfesor/" + profesor.getRut() + "-NotasProfesor.xml").exists());
        assertTrue(new File("files/reportes/reporteNotasProfesor/" + profesor.getRut() + "-NotasProfesor.xml").exists());
        assertTrue(new File("files/reportes/reporteNotasProfesor/" + profesor.getRut() + "-NotasProfesor.xml").exists());
    }

    @Test
    public void reportePlanificaciones() {
        Apoderado apoderado = Search.buscarApoderados()[0];
        ReportePlanificaciones rp = new ReportePlanificaciones(apoderado);
        HashMap<String, String> reportes = rp.generar(new File("files/xslt"), true, true, true, true, true);
        assertNotNull(reportes);
        assertEquals(5, reportes.size());
        assertNotNull(reportes.get("xml"));
        assertNotNull(reportes.get("json"));
        assertNotNull(reportes.get("html"));
        assertNotNull(reportes.get("xlsx"));
        assertNotNull(reportes.get("docx"));
        assertTrue(new File("files/reportes/reportePlanificaciones/" + apoderado.getRut() + "-Planificaciones.xml").exists());
        assertTrue(new File("files/reportes/reportePlanificaciones/" + apoderado.getRut() + "-Planificaciones.json").exists());
        assertTrue(new File("files/reportes/reportePlanificaciones/" + apoderado.getRut() + "-Planificaciones.html").exists());
        assertTrue(new File("files/reportes/reportePlanificaciones/" + apoderado.getRut() + "-Planificaciones.xlsx").exists());
        assertTrue(new File("files/reportes/reportePlanificaciones/" + apoderado.getRut() + "-Planificaciones.docx").exists());
    }

    @Test
    public void reporteReprobando() {
        ReporteReprobando rr = new ReporteReprobando();
        HashMap<String, String> reportes = rr.generar(new File("files/xslt"), true, true, true, true, true);
        assertNotNull(reportes);
        assertEquals(5, reportes.size());
        assertNotNull(reportes.get("xml"));
        assertNotNull(reportes.get("json"));
        assertNotNull(reportes.get("html"));
        assertNotNull(reportes.get("xlsx"));
        assertNotNull(reportes.get("docx"));
        assertTrue(new File("files/reportes/reporteReprobando/reporteReprobado.xml").exists());
        assertTrue(new File("files/reportes/reporteReprobando/reporteReprobado.json").exists());
        assertTrue(new File("files/reportes/reporteReprobando/reporteReprobando.html").exists());
        assertTrue(new File("files/reportes/reporteReprobando/reporteReprobando.xlsx").exists());
        assertTrue(new File("files/reportes/reporteReprobando/reporteReprobando.docx").exists());
    }
}