/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ryuuji.api;

import java.util.Date;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import logica.ExNihilo;
import logica.Search;
import orm.*;

/**
 * Servicio que basicamente impplementa la clase Search de la ApiDatabase.
 * Cada funcion corresponde a una en la api, esta clase solo funciona como puente entre la api y el servicio.
 * @author ryuuji
 */
@WebService(serviceName = "SearchService")
public class SearchService {

    //Colegio 
    /**
     * Busca un colegio segun su nombre
     * Llama al metodo {@link logica.Search#buscarColegio(java.lang.String)}
     *
     * @param nombre
     * @return
     */
    @WebMethod(operationName = "buscarColegio")
    public Colegio buscarColegio(@WebParam(name = "nombre") String nombre) {
        return Search.buscarColegio(nombre);
    }

    /**
     * Busca todos los colegios almacenados
     * Llama al metodo {@link logica.Search#buscarColegios()}
     *
     * @return
     */
    @WebMethod(operationName = "buscarColegios")
    public Colegio[] buscarColegios() {
        return Search.buscarColegios();
    }

    //Curso
    /**
     * Busca un curso especifico 
     * Llama al metodo {@link logica.Search#buscarCurso(int, java.lang.String) ()}
     *
     * @param nivel
     * @param letra
     * @return
     */
    @WebMethod(operationName = "buscarCurso")
    public Curso buscarCurso(@WebParam(name = "nivel") int nivel, @WebParam(name = "letra") String letra) {
        return Search.buscarCurso(nivel, letra);
    }

    /**
     * Busca los cursos de un colegio
     * Llama al metodo {@link logica.Search#buscarCursos(orm.Colegio) }
     *
     * @param colegio
     * @return
     */
    @WebMethod(operationName = "buscarCursosPorColegio")
    public Curso[] buscarCursosPorColegio(@WebParam(name = "colegio") Colegio colegio) {
        return Search.buscarCursos(colegio);
    }

    /**
     * Busca todos los cursos del sistema
     * Llama al metodo {@link logica.Search#buscarCursos() }
     *
     * @return
     */
    @WebMethod(operationName = "buscarCursos")
    public Curso[] buscarCursos() {
        return Search.buscarCursos();
    }

    //Apoderado
    /**
     * Busca un apoderado por su rut
     * Llama al metodo {@link logica.Search#buscarApoderado(java.lang.String) }
     *
     * @param rut
     * @return
     */
    @WebMethod(operationName = "buscarApoderado")
    public Apoderado buscarApoderado(@WebParam(name = "rut") String rut) {
        return Search.buscarApoderado(rut);
    }

    /**
     * Busca todos los apoderados de un colegio
     * Llama al metodo {@link logica.Search#buscarApoderados(orm.Colegio) }
     *
     * @param colegio
     * @return
     */
    @WebMethod(operationName = "buscarApoderadosPorColegio")
    public Apoderado[] buscarApoderadosPorColegio(@WebParam(name = "colegio") Colegio colegio) {
        return Search.buscarApoderados(colegio);
    }

    /**
     * Busca todos los apoderados
     * Llama al metodo {@link logica.Search#buscarApoderados() }
     *
     * @return
     */
    @WebMethod(operationName = "buscarApoderados")
    public Apoderado[] buscarApoderados() {
        return Search.buscarApoderados();
    }

    //Estudiante
    /**
     * Busca un estudiante por su rut
     * Llama al metodo {@link logica.Search#buscarEstudiante(java.lang.String) }
     *
     * @param rut
     * @return
     */
    @WebMethod(operationName = "buscarEstudiante")
    public Estudiante buscarEstudiante(@WebParam(name = "rut") String rut) {
        return Search.buscarEstudiante(rut);
    }

    /**
     * Busca a los estudiantes de un curso
     * Llama al metodo {@link logica.Search#buscarEstudiantes(orm.Curso) }
     *
     * @param curso
     * @return
     */
    @WebMethod(operationName = "buscarEstudiantesPorCurso")
    public Estudiante[] buscarEstudiantesPorCurso(@WebParam(name = "curso") Curso curso) {
        return Search.buscarEstudiantes(curso);
    }

    /**
     * Busca a los estudiantes de un apoderado
     * Llama al metodo {@link logica.Search#buscarEstudiantes(orm.Apoderado) }
     * @param apoderado
     * @return
     */
    @WebMethod(operationName = "buscarEstudiantesPorApoderado")
    public Estudiante[] buscarEstudiantesPorApoderado(@WebParam(name = "apoderado") Apoderado apoderado) {
        return Search.buscarEstudiantes(apoderado);
    }

    /**
     * Busca a los todos los estudiantes
     * Llama al metodo {@link logica.Search#buscarEstudiantes() }
     * @return 
     */
    @WebMethod(operationName = "buscarEstudiantes")
    public Estudiante[] buscarEstudiantes() {
        return Search.buscarEstudiantes();
    }

    //Asistencia
    /**
     * Busca una asistencia especifica.
     * Llama al metodo {@link logica.Search#buscarAsistencia(orm.Estudiante, java.util.Date, boolean) }
     * @param estudiante
     * @param dia
     * @param asistio
     * @return 
     */
    @WebMethod(operationName = "buscarAsistencia")
    public Asistencia buscarAsistencia(@WebParam(name = "estudiante") Estudiante estudiante, @WebParam(name = "dia") Date dia, @WebParam(name = "asistio") boolean asistio) {
        return Search.buscarAsistencia(estudiante, dia, asistio);
    }

    /**
     * Busca las asistencias de un estudiante
     * Llama al metodo {@link logica.Search#buscarAsistencias(orm.Estudiante) }
     * @param estudiante
     * @return 
     */
    @WebMethod(operationName = "buscarAsistenciasPorEstudiante")
    public Asistencia[] buscarAsistenciasPorEstudiante(@WebParam(name = "estudiante") Estudiante estudiante) {
        return Search.buscarAsistencias(estudiante);
    }

    /**
     * Busca todas las asistencias del sistema
     * Llama al metodo {@link logica.Search#buscarAsistencias() }
     * @return 
     */
    @WebMethod(operationName = "buscarAsistencias")
    public Asistencia[] buscarAsistencias() {
        return Search.buscarAsistencias();
    }

    //Nota
    /**
     * Busca una nota en especifico
     * Llama al metodo {@link logica.Search#buscarNota(orm.Estudiante, orm.Asignatura, double) }
     * @param estudiante
     * @param asignatura
     * @param valor
     * @return 
     */
    @WebMethod(operationName = "buscarNota")
    public Nota buscarNota(@WebParam(name = "estudiante") Estudiante estudiante, @WebParam(name = "asignatura") Asignatura asignatura, @WebParam(name = "valor") double valor) {
        return Search.buscarNota(estudiante, asignatura, valor);
    }

    /**
     * Busca todas las notas de un estudiante
     * Llama al metodo {@link logica.Search#buscarNotas(orm.Estudiante) }
     * @param estudiante
     * @return 
     */
    @WebMethod(operationName = "buscarNotasPorEstudiante")
    public Nota[] buscarNotasPorEstudiante(@WebParam(name = "estudiante") Estudiante estudiante) {
        return Search.buscarNotas(estudiante);
    }

    
    /**
     * Busca todas las notas de una asignatura
     * Llama al metodo {@link logica.Search#buscarNotas(orm.Asignatura) }
     * @param asignatura
     * @return 
     */
    @WebMethod(operationName = "buscarNotasPorAsignatura")
    public Nota[] buscarNotasPorAsignatura(@WebParam(name = "asignatura") Asignatura asignatura) {
        return Search.buscarNotas(asignatura);
    }

    
    /**
     * Busca todas las notas existentes
     * Llama al metodo {@link logica.Search#buscarNotas() }
     * @return 
     */
    @WebMethod(operationName = "buscarNotas")
    public Nota[] buscarNotas() {
        return Search.buscarNotas();
    }

    //Anotacion
    /**
     * Busca una anotacion en especifico
     * Llama al metodo {@link logica.Search#buscarAnotacion(orm.Estudiante, orm.Profesor, java.lang.String, boolean) }
     * @param estudiante
     * @param profesor
     * @param descripcion
     * @param positiva
     * @return 
     */
    @WebMethod(operationName = "buscarAnotacion")
    public Anotacion buscarAnotacion(@WebParam(name = "estudiante") Estudiante estudiante, @WebParam(name = "profesor") Profesor profesor, @WebParam(name = "descripcion") String descripcion, @WebParam(name = "positiva") boolean positiva) {
        return Search.buscarAnotacion(estudiante, profesor, descripcion, positiva);
    }

    
    /**
     * Busca todas las anotaciones de un estudiante
     * Llama al metodo {@link logica.Search#buscarAnotaciones(orm.Estudiante) }
     * @param estudiante
     * @return 
     */
    @WebMethod(operationName = "buscarAnotacionesPorEstudiante")
    public Anotacion[] buscarAnotacionesPorEstudiante(@WebParam(name = "estudiante") Estudiante estudiante) {
        return Search.buscarAnotaciones(estudiante);
    }

    /**
     * Busca todas las anotaciones ingresadas por un profesor
     * Llama al metodo {@link logica.Search#buscarAnotaciones(orm.Profesor) }
     * @param profesor
     * @return 
     */
    @WebMethod(operationName = "buscarAnotacionesPorProfesor")
    public Anotacion[] buscarAnotacionesPorProfesor(@WebParam(name = "profesor") Profesor profesor) {
        return Search.buscarAnotaciones(profesor);
    }

    /**
     * Busca todas las anotaciones del sistema
     * Llama al metodo {@link logica.Search#buscarAnotaciones() }
     * @return 
     */
    @WebMethod(operationName = "buscarAnotaciones")
    public Anotacion[] buscarAnotaciones() {
        return Search.buscarAnotaciones();
    }

    //Profesor
    /**
     * Busca un profesor en especifico por su rut
     * Llama al metodo {@link logica.Search#buscarProfesor(java.lang.String) }
     * @param rut
     * @return 
     */
    @WebMethod(operationName = "buscarProfesor")
    public Profesor buscarProfesor(@WebParam(name = "rut") String rut) {
        return Search.buscarProfesor(rut);
    }

    /**
     * Busca todos los profesores que le hacen clases a un curso
     * Llama al metodo {@link logica.Search#buscarProfesores(orm.Curso) }
     * @param curso
     * @return 
     */
    @WebMethod(operationName = "buscarProfesoresPorCurso")
    public Profesor[] buscarProfesoresPorCurso(@WebParam(name = "curso") Curso curso) {
        return Search.buscarProfesores(curso);
    }

    /**
     * Busca todos los profesores de un colegio
     * Llama al metodo {@link logica.Search#buscarProfesores(orm.Colegio) }
     * @param colegio
     * @return 
     */
    @WebMethod(operationName = "buscarProfesoresPorColegio")
    public Profesor[] buscarProfesoresPorColegio(@WebParam(name = "colegio") Colegio colegio) {
        return Search.buscarProfesores(colegio);
    }

    /**
     * Busca todos los profesores en el sistema
     * Llama al metodo {@link logica.Search#buscarProfesores() }
     * @return 
     */
    @WebMethod(operationName = "buscarProfesores")
    public Profesor[] buscarProfesores() {
        return Search.buscarProfesores();
    }

    //Asignatura
    /**
     * Busca una asignatura en especifico
     * Llama al metodo {@link logica.Search#buscarAsignatura(java.lang.String, orm.Curso) }
     * @param nombre
     * @param curso
     * @return 
     */
    @WebMethod(operationName = "buscarAsignatura")
    public Asignatura buscarAsignatura(@WebParam(name = "nombre") String nombre, @WebParam(name = "curso") Curso curso) {
        return Search.buscarAsignatura(nombre, curso);
    }

    /**
     * Busca todas las asignaturas de un curso
     * Llama al metodo {@link logica.Search#buscarAsignaturas(orm.Curso) }
     * @param curso
     * @return 
     */
    @WebMethod(operationName = "buscarAsignaturasPorCurso")
    public Asignatura[] buscarAsignaturasPorCurso(@WebParam(name = "curso") Curso curso) {
        return Search.buscarAsignaturas(curso);
    }

    /**
     * Busca todas las asignaturas que realiza un profesor
     * Llama al metodo {@link logica.Search#buscarAsignaturas(orm.Profesor) }
     * @param profesor
     * @return 
     */
    @WebMethod(operationName = "buscarAsignaturasPorProfesor")
    public Asignatura[] buscarAsignaturasPorProfesor(@WebParam(name = "profesor") Profesor profesor) {
        return Search.buscarAsignaturas(profesor);
    }

    /**
     * Busca todas las asignaturas en el sistema
     * Llama al metodo {@link logica.Search#buscarAsignaturas() }
     * @return 
     */
    @WebMethod(operationName = "buscarAsignaturas")
    public Asignatura[] buscarAsignaturas() {
        return Search.buscarAsignaturas();
    }

    //Actividad
    /**
     * Busca una actividad en especifico
     * Llama al metodo {@link logica.Search#buscarActividad(orm.Asignatura, java.util.Date, java.lang.String) }
     * @param asignatura
     * @param fecha
     * @param tipo
     * @return 
     */
    @WebMethod(operationName = "buscarActividad")
    public Actividad buscarActividad(@WebParam(name = "asignatura") Asignatura asignatura, @WebParam(name = "fecha") Date fecha, @WebParam(name = "tipo") String tipo) {
        return Search.buscarActividad(asignatura, fecha, tipo);
    }

    /**
     * Busca todas las actividades de una asignatura
     * Llama al metodo {@link logica.Search#buscarActividades(orm.Asignatura) }
     * @param asignatura
     * @return 
     */
    @WebMethod(operationName = "buscarActividadesPorAsignatura")
    public Actividad[] buscarActividadesPorAsignatura(@WebParam(name = "asignatura") Asignatura asignatura) {
        return Search.buscarActividades(asignatura);
    }

    /**
     * Busca todas las actividades que se realizaran en una fecha
     * Llama al metodo {@link logica.Search#buscarActividades(java.util.Date) }
     * @param fecha
     * @return 
     */
    @WebMethod(operationName = "buscarActividadesPorFecha")
    public Actividad[] buscarActividadesPorFecha(@WebParam(name = "fecha") Date fecha) {
        return Search.buscarActividades(fecha);
    }

    /**
     * Busca todas las actividades de un tipo especifico
     * Llama al metodo {@link logica.Search#buscarActividades(java.lang.String) }
     * @param tipo
     * @return 
     */
    @WebMethod(operationName = "buscarActividadesPorTipo")
    public Actividad[] buscarActividadesPorTipo(@WebParam(name = "tipo") String tipo) {
        return Search.buscarActividades(tipo);
    }

    /**
     * Busca todas las actividades en el sistema.
     * Llama al metodo {@link logica.Search#buscarActividades() }
     * @return 
     */
    @WebMethod(operationName = "buscarActividades")
    public Actividad[] buscarActividades() {
        return Search.buscarActividades();
    }

}
