package com.ejie.ab79.control.propuestaSancion;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.control.ActuacionesController;
import com.ejie.ab79.control.RelActDocController;
import com.ejie.ab79.model.DocumentosSubidos;
import com.ejie.ab79.model.actuaciones.Actuaciones;
import com.ejie.ab79.model.actuaciones.RelActDoc;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.propuestaSancion.DocumentosPropuesta;
import com.ejie.ab79.service.DocumentosSubidosService;
import com.ejie.ab79.service.actuaciones.RelActDocService;
import com.ejie.ab79.service.propuestaSancion.PropuestaSancionDocumentosService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;

/**
 * 
 * PropuestaSancionController
 * 
 *  
 *
 */
@Controller
@SessionAttributes("usuario")
@RequestMapping(value = "propuestaSancionDocumentos")
public class PropuestaSancionDocumentosController {

	@Autowired
	PropuestaSancionDocumentosService documentosService;
	@Autowired
	ActuacionesController actuacionesController;
	@Autowired
	RelActDocController documentosActuacionController;
	@Autowired
	private RelActDocService relActDocService;
	@Autowired
	private DocumentosSubidosService documentosSubidosService;

	/**
	 * 
	 * @param filterDocumentoPropuesta
	 *            DocumentosPropuesta
	 * @param tableRequestDto
	 *            TableRequestDto
	 * 
	 * @return TableResponseDto<DocumentosPropuesta>
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<DocumentosPropuesta> filter(
			@RequestJsonBody(param = "filter") DocumentosPropuesta filterDocumentoPropuesta,
			@RequestJsonBody TableRequestDto tableRequestDto) {

		int idInspeccion = filterDocumentoPropuesta.getIdInspeccion();
		List<DocumentosPropuesta> listaDocumentos = new ArrayList<DocumentosPropuesta>();

		/* Busqueda en la tabla actuaciones para la inspeccion */

		for (DocumentosSubidos documentoActuacion : buscarDocumentosActuacion(idInspeccion)) {
			listaDocumentos.add(rellenarDocumento(documentoActuacion));
		}

		Long recordNum = (long) listaDocumentos.size();
		TableResponseDto<DocumentosPropuesta> tablaResultados = new TableResponseDto<DocumentosPropuesta>(
				tableRequestDto, recordNum, listaDocumentos);

		List<DocumentosPropuesta> listAux = new ArrayList<DocumentosPropuesta>();
		for (DocumentosPropuesta documento : listaDocumentos) {
			listAux.add(documento);
		}
		tablaResultados.setRows(listAux);
		return tablaResultados;
	}

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * 
	 * @return boolean
	 */
	@RequestMapping(value = "/comprobarDocumentos/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody boolean comprobarDocumentos(@PathVariable int idInspeccion) {
		boolean documentosValidos = true;

		Long docActuacionesSinEnviar = this.relActDocService.documentosSinEnviar(idInspeccion);

		if (docActuacionesSinEnviar > 0) {
			documentosValidos = false;
		}

		return documentosValidos;
	}

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * 
	 * @return List<String>
	 */
	@RequestMapping(value = "/obtenerEnviados/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody List<Integer> obtenerEnviados(@PathVariable int idInspeccion) {

		List<Integer> listaDoc = new ArrayList<Integer>();
		for (DocumentosSubidos documentoActuacion : this.buscarDocumentosActuacion(idInspeccion)) {
			if (documentoActuacion.getEnviadoProSan() != null
					&& documentoActuacion.getEnviadoProSan() == Constantes.ENVIADO_PRO_SAN_SI) {
				listaDoc.add(documentoActuacion.getIdRelActDoc());
			}
		}
		return listaDoc;
	}

	/**
	 * 
	 * @param docSelected
	 *            String[]
	 * @param idInspeccion
	 *            int
	 * 
	 * @return boolean
	 */
	public boolean updateEnviados(int[] docSelected, int idInspeccion) {
		List<DocumentosSubidos> listaDocActuaciones = this.buscarDocumentosActuacion(idInspeccion);
		RelActDoc actDocAux = new RelActDoc();

		for (DocumentosSubidos actuacionDoc : listaDocActuaciones) {
			if (ArrayUtils.contains(docSelected, actuacionDoc.getIdRelActDoc())) {
				actDocAux.setIdRelActDoc(actuacionDoc.getIdRelActDoc());
				actDocAux.setEnviadoProSan(Constantes.ENVIADO_PRO_SAN_SI);
				documentosActuacionController.editEnviadoProSan(actDocAux);
			} else {
				actDocAux.setIdRelActDoc(actuacionDoc.getIdRelActDoc());
				actDocAux.setEnviadoProSan(Constantes.ENVIADO_PRO_SAN_NO);
				documentosActuacionController.editEnviadoProSan(actDocAux);
			}
		}
		return true;
	}

	/**
	 * 
	 * @param idInspeccion
	 *            int
	 * 
	 * @return List<RelActDoc>
	 */
	private List<DocumentosSubidos> buscarDocumentosActuacion(int idInspeccion) {

		Inspecciones inspeccion = new Inspecciones();
		inspeccion.setIdInspeccion(idInspeccion);
		Actuaciones filterActuaciones = new Actuaciones();

		filterActuaciones.setInspeccion(inspeccion);

		List<Actuaciones> listaActuaciones = actuacionesController.getAll(filterActuaciones);
		List<DocumentosSubidos> listaDocumentosReturn = new ArrayList<DocumentosSubidos>();

		for (Actuaciones actuacion : listaActuaciones) {
			DocumentosSubidos filterDocumentoActuacion = new DocumentosSubidos();
			filterDocumentoActuacion.setIdActuacion(actuacion.getIdActuacion());
			List<DocumentosSubidos> listaDocsActuacion = documentosSubidosService.findAllLike(filterDocumentoActuacion,
					null, false);
			for (DocumentosSubidos documentoActuacion : listaDocsActuacion) {
				listaDocumentosReturn.add(documentoActuacion);
			}
		}
		return listaDocumentosReturn;
	}

	/**
	 * 
	 * @param documento
	 *            Object
	 * 
	 * @return DocumentosPropuesta
	 */
	private DocumentosPropuesta rellenarDocumento(Object documento) {
		DocumentosPropuesta documentoPropuesta = new DocumentosPropuesta();

		if (documento instanceof DocumentosSubidos) {
			if (((DocumentosSubidos) documento).getPlantilla() != null)
				documentoPropuesta.setPlantilla(((DocumentosSubidos) documento).getPlantilla());
			if (((DocumentosSubidos) documento).getFechaRegistro() != null)
				documentoPropuesta.setFechaRegistro(((DocumentosSubidos) documento).getFechaRegistro());
			if (((DocumentosSubidos) documento).getUsuarioRegistro() != null)
				documentoPropuesta.setUsuarioRegistro(((DocumentosSubidos) documento).getUsuarioRegistro());
			if (((DocumentosSubidos) documento).getIdActuacion() != null)
				documentoPropuesta.setIdActuacion(((DocumentosSubidos) documento).getIdActuacion());
			if (((DocumentosSubidos) documento).getNombreDocumento() != null)
				documentoPropuesta.setNombreDocumento(((DocumentosSubidos) documento).getNombreDocumento());
			if (((DocumentosSubidos) documento).getOidPid() != null)
				documentoPropuesta.setPid(((DocumentosSubidos) documento).getOidPid());
			if (((DocumentosSubidos) documento).getOidDokusi() != null)
				documentoPropuesta.setDokusi(((DocumentosSubidos) documento).getOidDokusi());
			if (((DocumentosSubidos) documento).getAportadoExpediente() != null)
				documentoPropuesta.setAportadoExpediente(((DocumentosSubidos) documento).getAportadoExpediente());
			if (((DocumentosSubidos) documento).getIdRelActDoc() != null)
				documentoPropuesta.setIdRelActDoc(((DocumentosSubidos) documento).getIdRelActDoc());
			if (((DocumentosSubidos) documento).getEnviadoProSan() != null)
				documentoPropuesta.setEnviadoProSan(((DocumentosSubidos) documento).getEnviadoProSan());
			documentoPropuesta.setTipoDocumento(Constantes.ACTUACION);
		}

		return documentoPropuesta;
	}

	/**
	 * 
	 * @param filterDocumentoPropuesta
	 *            DocumentosPropuesta
	 * 
	 * @return List<DocumentosPropuesta>
	 */
	public List<DocumentosPropuesta> getAll(DocumentosPropuesta filterDocumentoPropuesta) {

		int idInspeccion = filterDocumentoPropuesta.getIdInspeccion();
		List<DocumentosPropuesta> listaDocumentos = new ArrayList<DocumentosPropuesta>();

		/* Busqueda en la tabla actuaciones para la inspeccion */

		for (DocumentosSubidos documentoActuacion : buscarDocumentosActuacion(idInspeccion)) {
			listaDocumentos.add(rellenarDocumento(documentoActuacion));
		}

		return listaDocumentos;
	}
}
