package logica;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import orm.*;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import static org.junit.Assert.*;

public class CRUDTest {
    @Before
    public void setUp() throws Exception {
        ExNihilo.deleteAll();
    }

    public void crearColegio() {
        String nombre = "Jhon";
        Colegio antes = Search.buscarColegio(nombre);
        assertNull(antes);
        ExNihilo.crearColegio(nombre);
        Colegio despues = Search.buscarColegio(nombre);
        assertNotNull(despues);
        assertNotEquals(antes, despues);
    }

    public void buscarColegio() {
        assertNotNull(Search.buscarColegios());
        assertNotNull(Search.buscarColegio("Jhon"));
    }

    public void modificarColegio() {
        String aNombre = "Jhon";
        String dNombre = "Doe";
        Colegio colegio = Search.buscarColegio(aNombre);
        assertNotNull(colegio);
        boolean exitoso = ExNihilo.modificarColegio(colegio, dNombre);
        assertEquals(dNombre, colegio.getNombre());
    }

    public void eliminarColegio() {
        String nombre = "Doe";
        Colegio antes = Search.buscarColegio(nombre);
        assertNotNull(antes);
        ExNihilo.eliminarColegio(antes);
        Colegio despues = Search.buscarColegio(nombre);
        assertNull(despues);

    }

    @Test
    public void crudColegio() {
        crearColegio();
        buscarColegio();
        modificarColegio();
        eliminarColegio();
    }

    public void crearCurso() {
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");
        int nivel = 1;
        String letra = "A";

        Curso curso = Search.buscarCurso(nivel, letra);
        assertNull(curso);
        ExNihilo.crearCurso(nivel, letra, colegio);
        curso = Search.buscarCurso(nivel, letra);
        assertNotNull(curso);

    }

    public void buscarCurso() {
        assertNotNull(Search.buscarCursos());
        assertNotNull(Search.buscarCursos(Search.buscarColegios()[0]));
        assertNotNull(Search.buscarCurso(1, "A"));

    }

    public void modificarCurso() {
        int aNivel = 1;
        String aLetra = "A";
        int dNivel = 2;
        String dLetra = "B";
        Curso curso = Search.buscarCurso(aNivel, aLetra);
        assertNotNull(curso);
        assertEquals(curso.getLetra(), aLetra);
        ExNihilo.modificarCurso(curso, dNivel, dLetra, null);
        assertNotNull(curso);
        assertEquals(curso.getLetra(), dLetra);
    }

    public void eliminarCurso() {
        Curso curso = Search.buscarCurso(2, "B");
        assertNotNull(curso);
        ExNihilo.eliminarCurso(curso);
        Curso despues = Search.buscarCurso(2, "B");
        assertNull(despues);
    }

    @Test
    public void crudCurso() {
        crearCurso();
        buscarCurso();
        modificarCurso();
        eliminarCurso();
    }

    public void crearApoderado() {
        ExNihilo.crearColegio("Jhon");
        String nombre = "Jhon";
        String rut = "197638990";
        Apoderado antes = Search.buscarApoderado(rut);
        assertNull(antes);
        ExNihilo.crearApoderado(Search.buscarColegio("Jhon"), nombre, rut);
        Apoderado despues = Search.buscarApoderado(rut);
        assertNotNull(despues);
        assertNotEquals(antes, despues);
        assertEquals(despues.getNombre(), nombre);
        assertEquals(despues.getRut(), rut);
    }

    public void buscarApoderado() {
        assertNotNull(Search.buscarApoderado("197638990"));
        assertNotNull(Search.buscarApoderados(Search.buscarColegios()[0]));
        assertNotNull(Search.buscarApoderados());
    }

    public void modificarApoderado() {
        String rut = "197638990";
        String aNombre = "Jhon";
        String dNombre = "Doe";
        Apoderado apoderado = Search.buscarApoderado(rut);
        assertNotNull(apoderado);
        ExNihilo.modificarApoderado(apoderado, dNombre, null);
        apoderado = Search.buscarApoderado(rut);
        assertNotEquals(apoderado.getNombre(), aNombre);
        assertEquals(apoderado.getNombre(), dNombre);
    }

    public void eliminarApoderado() {
        String rut = "197638990";
        Apoderado apoderado = Search.buscarApoderado(rut);
        assertNotNull(apoderado);
        ExNihilo.eliminarApoderado(apoderado);
        apoderado = Search.buscarApoderado(rut);
        assertNull(apoderado);
    }

    @Test
    public void crudApoderado() {
        crearApoderado();
        buscarApoderado();
        modificarApoderado();
        eliminarApoderado();
    }

    public void crearEstudiante() {
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");
        ExNihilo.crearCurso(1, "A", colegio);
        Curso curso = Search.buscarCurso(1, "A");
        ExNihilo.crearApoderado(colegio, "Jhon", "108583320");
        Apoderado apoderado = Search.buscarApoderado("108583320");

        Estudiante estudiante = Search.buscarEstudiante("197638990");
        assertNull(estudiante);
        ExNihilo.crearEstudiante("Jhon", "197638990", curso, apoderado);
        estudiante = Search.buscarEstudiante("197638990");
        assertNotNull(estudiante);

    }

    public void buscarEstudiante() {
        assertNotNull(Search.buscarEstudiante("197638990"));
        assertNotNull(Search.buscarEstudiantes());
        assertNotNull(Search.buscarEstudiantes(Search.buscarCurso(1, "A")));
        assertNotNull(Search.buscarEstudiantes(Search.buscarApoderado("108583320")));
    }

    public void modificarEstudiante() {
        String rut = "197638990";
        String nRut = "99875372";
        Estudiante estudiante = Search.buscarEstudiante(rut);
        assertNotNull(estudiante);
        ExNihilo.modificarEstudiante(estudiante, null, nRut, null, null);
        estudiante = Search.buscarEstudiante(nRut);
        assertEquals(estudiante.getRut(), nRut);
    }

    public void eliminarEstudiante() {
        String rut = "99875372";
        Estudiante estudiante = Search.buscarEstudiante(rut);
        assertNotNull(estudiante);
        ExNihilo.eliminarEstudiante(estudiante);
        estudiante = Search.buscarEstudiante(rut);
        assertNull(estudiante);
    }

    @Test
    public void crudEstudiante() {
        crearEstudiante();
        buscarEstudiante();
        modificarEstudiante();
        eliminarEstudiante();
    }

    public void crearProfesor() {
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");

        Profesor profesor = Search.buscarProfesor("108583320");
        assertNull(profesor);
        ExNihilo.crearProfesor(colegio, "Jhon", "108583320");
        profesor = Search.buscarProfesor("108583320");
        assertNotNull(profesor);
    }

    public void buscarProfesor() {
        assertNotNull(Search.buscarProfesor("108583320"));
        assertNotNull(Search.buscarProfesores());
        assertNotNull(Search.buscarProfesores(Search.buscarColegio("Jhon")));
    }

    public void modificarProfesor() {
        Profesor profesor = Search.buscarProfesor("108583320");
        String vNombre = "Jhon";
        assertEquals(profesor.getNombre(), vNombre);
        String nNombre = "Doe";
        ExNihilo.modificarProfesor(profesor, nNombre, null);
        assertEquals(profesor.getNombre(), nNombre);
        assertNotEquals(profesor.getNombre(), vNombre);
    }

    public void eliminarProfesor() {
        Profesor profesor = Search.buscarProfesor("108583320");
        assertNotNull(profesor);
        ExNihilo.eliminarProfesor(profesor);
        profesor = Search.buscarProfesor("108583320");
        assertNull(profesor);
    }

    @Test
    public void crudProfesor() {
        crearProfesor();
        buscarProfesor();
        modificarProfesor();
        eliminarProfesor();
    }

    public void crearAsignatura() {
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");
        ExNihilo.crearCurso(1, "A", colegio);
        Curso curso = Search.buscarCurso(1, "A");
        ExNihilo.crearProfesor(colegio, "Jhon", "108583320");
        Profesor profesor = Search.buscarProfesor("108583320");

        Asignatura asignatura = Search.buscarAsignatura("Historia", curso);
        assertNull(asignatura);
        ExNihilo.crearAsignatura("Historia", curso, profesor);
        asignatura = Search.buscarAsignatura("Historia", curso);
        assertNotNull(asignatura);
    }

    public void buscarAsignatura() {
        assertNotNull(Search.buscarAsignatura("Historia", Search.buscarCurso(1, "A")));
        assertNotNull(Search.buscarAsignaturas(Search.buscarCurso(1, "A")));
        assertNotNull(Search.buscarAsignaturas(Search.buscarProfesor("108583320")));
        assertNotNull(Search.buscarAsignaturas());
    }

    public void modificarAsignatura() {
        String nNombre = "Matematicas";
        String vNombre = "Historia";
        Curso curso = Search.buscarCurso(1, "A");
        Asignatura asignatura = Search.buscarAsignatura(vNombre, curso);
        assertEquals(asignatura.getNombre(), vNombre);
        ExNihilo.modificarAsignatura(asignatura, nNombre, null, null);
        assertEquals(asignatura.getNombre(), nNombre);
    }

    public void eliminarAsignatura() {
        Curso curso = Search.buscarCurso(1, "A");
        Asignatura asignatura = Search.buscarAsignatura("Matematicas", curso);
        assertNotNull(asignatura);
        ExNihilo.eliminarAsignatura(asignatura);
        asignatura = Search.buscarAsignatura("Historia", curso);
        assertNull(asignatura);
    }

    @Test
    public void crudAsignatura() {
        crearAsignatura();
        buscarAsignatura();
        modificarAsignatura();
        eliminarAsignatura();
    }

    public void crearAsistencia() {
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");
        ExNihilo.crearCurso(1, "A", colegio);
        Curso curso = Search.buscarCurso(1, "A");
        ExNihilo.crearApoderado(colegio, "Jhon", "108583320");
        Apoderado apoderado = Search.buscarApoderado("108583320");
        ExNihilo.crearEstudiante("Jhon", "197638990", curso, apoderado);
        Estudiante estudiante = Search.buscarEstudiante("197638990");

        Date fecha = new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime();
        boolean asistio = true;
        Asistencia asistencia = Search.buscarAsistencia(estudiante, fecha, asistio);
        assertNull(asistencia);
        ExNihilo.crearAsistencia(fecha, asistio, estudiante);
        asistencia = Search.buscarAsistencia(estudiante, fecha, asistio);
        assertNotNull(asistencia);

    }

    public void buscarAsistencia() {
        assertNotNull(Search.buscarAsistencias());
        assertNotNull(Search.buscarAsistencias(Search.buscarEstudiante("197638990")));
        assertNotNull(Search.buscarAsistencia(Search.buscarEstudiante("197638990"), new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime(), true));
    }

    public void modificarAsistencia() {
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        Date fecha = new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime();
        boolean asistio = true;
        Asistencia asistencia = Search.buscarAsistencia(estudiante, fecha, asistio);
        assertNotNull(asistencia);
        ExNihilo.modificarAsistencia(asistencia, null, !asistio, null);
        asistencia = Search.buscarAsistencia(estudiante, fecha, !asistio);
        assertNotEquals(asistencia.getAsistio(), asistio);
        assertEquals(asistencia.getAsistio(), !asistio);
    }

    public void eliminarAsistencia() {
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        Date fecha = new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime();
        boolean asistio = false;
        Asistencia asistencia = Search.buscarAsistencia(estudiante, fecha, asistio);
        assertNotNull(asistencia);
        ExNihilo.eliminarAsistencia(asistencia);
        asistencia = Search.buscarAsistencia(estudiante, fecha, asistio);
        assertNull(asistencia);
    }

    @Test
    public void crudAsistencia() {
        crearAsistencia();
        buscarAsistencia();
        modificarAsistencia();
        eliminarAsistencia();
    }

    public void crearNota() {
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");
        ExNihilo.crearCurso(1, "A", colegio);
        Curso curso = Search.buscarCurso(1, "A");
        ExNihilo.crearApoderado(colegio, "Jhon", "108583320");
        Apoderado apoderado = Search.buscarApoderado("108583320");
        ExNihilo.crearEstudiante("Jhon", "197638990", curso, apoderado);
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        ExNihilo.crearProfesor(colegio, "Jhon", "99875372");
        Profesor profesor = Search.buscarProfesor("99875372");
        ExNihilo.crearAsignatura("Historia", curso, profesor);
        Asignatura asignatura = Search.buscarAsignatura("Historia", curso);

        Nota nota = Search.buscarNota(estudiante, asignatura, 7.0D);
        assertNull(nota);
        ExNihilo.crearNota(7.0D, asignatura, estudiante);
        nota = Search.buscarNota(estudiante, asignatura, 7.0D);
        assertNotNull(nota);

    }

    public void buscarNota() {
        assertNotNull(Search.buscarNotas());
        assertNotNull(Search.buscarNota(Search.buscarEstudiante("197638990"), Search.buscarAsignatura("Historia", Search.buscarCurso(1, "A")), 7.0D));
        assertNotNull(Search.buscarNotas(Search.buscarAsignatura("Historia", Search.buscarCurso(1, "A"))));
        assertNotNull(Search.buscarNotas(Search.buscarEstudiante("197638990")));
    }

    public void modificarNota() {
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        Curso curso = Search.buscarCurso(1, "A");
        Asignatura asignatura = Search.buscarAsignatura("Historia", curso);
        Nota nota = Search.buscarNota(estudiante, asignatura, 7.0D);
        assertEquals(nota.getValor(), (Double) 7.0D);
        double nNota = 5.0D;
        ExNihilo.modificarNota(nota, nNota, null, null);
        assertEquals(nota.getValor(), (Double) nNota);
    }

    public void eliminarNota() {
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        Curso curso = Search.buscarCurso(1, "A");
        Asignatura asignatura = Search.buscarAsignatura("Historia", curso);
        Nota nota = Search.buscarNota(estudiante, asignatura, 5.0D);
        assertNotNull(nota);
        ExNihilo.eliminarNota(nota);
        nota = Search.buscarNota(estudiante, asignatura, 5.0D);
        assertNull(nota);
    }

    @Test
    public void crudNota() {
        crearNota();
        buscarNota();
        modificarNota();
        eliminarNota();
    }

    public void crearAnotacion() {
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");
        ExNihilo.crearCurso(1, "A", colegio);
        Curso curso = Search.buscarCurso(1, "A");
        ExNihilo.crearApoderado(colegio, "Jhon", "108583320");
        Apoderado apoderado = Search.buscarApoderado("108583320");
        ExNihilo.crearEstudiante("Jhon", "197638990", curso, apoderado);
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        ExNihilo.crearProfesor(colegio, "Jhon", "99875372");
        Profesor profesor = Search.buscarProfesor("99875372");

        Anotacion anotacion = Search.buscarAnotacion(estudiante, profesor, "Random", true);
        assertNull(anotacion);
        ExNihilo.crearAnotacion(true, "Random", estudiante, profesor);
        anotacion = Search.buscarAnotacion(estudiante, profesor, "Random", true);
        assertNotNull(anotacion);
    }

    public void buscarAnotacion() {
        assertNotNull(Search.buscarAnotacion(Search.buscarEstudiante("197638990"),
                Search.buscarProfesor("99875372"),
                "Random",
                true));
        assertNotNull(Search.buscarAnotaciones());
        assertNotNull(Search.buscarAnotaciones(Search.buscarEstudiante("197638990")));
        assertNotNull(Search.buscarAnotaciones(Search.buscarProfesor("99875372")));
    }

    public void modificarAnotacion() {
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        Profesor profesor = Search.buscarProfesor("99875372");
        Anotacion anotacion = Search.buscarAnotacion(estudiante, profesor, "Random", true);
        assertNotNull(anotacion);
        assertEquals(anotacion.getPositiva(), true);
        ExNihilo.modificarAnotacion(anotacion, false, null, null, null);
        anotacion = Search.buscarAnotacion(estudiante, profesor, "Random", false);
        assertEquals(anotacion.getPositiva(), false);
    }

    public void eliminarAnotacion() {
        Estudiante estudiante = Search.buscarEstudiante("197638990");
        Profesor profesor = Search.buscarProfesor("99875372");
        Anotacion anotacion = Search.buscarAnotacion(estudiante, profesor, "Random", false);
        assertNotNull(anotacion);
        ExNihilo.eliminarAnotacion(anotacion);
        anotacion = Search.buscarAnotacion(estudiante, profesor, "Random", false);
        assertNull(anotacion);

    }

    @Test
    public void crudAnotacion() {
        crearAnotacion();
        buscarAnotacion();
        modificarAnotacion();
        eliminarAnotacion();
    }

    public void crearActividad() {
        Date fecha = new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime();
        ExNihilo.crearColegio("Jhon");
        Colegio colegio = Search.buscarColegio("Jhon");
        ExNihilo.crearCurso(1, "A", colegio);
        Curso curso = Search.buscarCurso(1, "A");
        ExNihilo.crearProfesor(colegio, "Jhon", "99875372");
        Profesor profesor = Search.buscarProfesor("99875372");
        ExNihilo.crearAsignatura("Historia", curso, profesor);
        Asignatura asignatura = Search.buscarAsignatura("Historia", curso);

        Actividad actividad = Search.buscarActividad(asignatura, fecha, "Prueba");
        assertNull(actividad);
        ExNihilo.crearActividad(fecha, "Prueba", asignatura);
        actividad = Search.buscarActividad(asignatura, fecha, "Prueba");
        assertNotNull(actividad);
    }

    public void buscarActividad() {
        assertNotNull(Search.buscarActividades());
        assertNotNull(Search.buscarActividad(
                Search.buscarAsignatura("Historia", Search.buscarCurso(1, "A")),
                new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime(),
                "Prueba"));
        assertNotNull(Search.buscarActividades(new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime()));
        assertNotNull(Search.buscarActividades(Search.buscarAsignatura("Historia", Search.buscarCurso(1, "A"))));
        assertNotNull(Search.buscarActividades("Prueba"));
    }

    public void modificarActividad() {
        Date fecha = new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime();
        Curso curso = Search.buscarCurso(1, "A");
        Asignatura asignatura = Search.buscarAsignatura("Historia", curso);
        Actividad actividad = Search.buscarActividad(asignatura, fecha, "Prueba");
        assertNotNull(actividad);
        ExNihilo.modificarActividad(actividad, null, "Taller", null);
        actividad = Search.buscarActividad(asignatura, fecha, "Taller");
        assertEquals(actividad.getTipo(), "Taller");
    }

    public void eliminarActividad() {
        Date fecha = new GregorianCalendar(2017, Calendar.JANUARY, 1).getTime();
        Curso curso = Search.buscarCurso(1, "A");
        Asignatura asignatura = Search.buscarAsignatura("Historia", curso);
        Actividad actividad = Search.buscarActividad(asignatura, fecha, "Taller");
        assertNotNull(actividad);
        ExNihilo.eliminarActividad(actividad);
        actividad = Search.buscarActividad(asignatura, fecha, "Taller");
        assertNull(actividad);
    }

    @Test
    public void crudActividad() {
        crearActividad();
        buscarActividad();
        modificarActividad();
        eliminarActividad();
    }

    @After
    public void tearDown() {
        ExNihilo.deleteAll();
    }

}