/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.service.impl;

import com.rjconsultores.ventaboletos.dao.ConfigRestriccionPagoDAO;
import com.rjconsultores.ventaboletos.entidad.ConfigRestriccionPago;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FormaPago;
import com.rjconsultores.ventaboletos.entidad.RestriccionPago;
import com.rjconsultores.ventaboletos.service.ConfigRestriccionPagoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Administrador
 */
@Service("configRestriccionPagoService")
public class ConfigRestriccionPagoServiceImpl implements ConfigRestriccionPagoService {

    public static final Integer RESTRICCION_CANCELABLE = 1;
    public static final Integer RESTRICCION_TRANSFERIBLE = 2;
    public static final Integer RESTRICCION_RESERVABLE = 3;
    public static final Integer RESTRICCION_NO_CANCELABLE = 4;
    public static final Integer RESTRICCION_NO_TRANSFERIBLE = 5;
    public static final Integer RESTRICCION_NO_RESERVABLE = 6;
    @Autowired
    private ConfigRestriccionPagoDAO configRestriccionPagoDAO;

    public List<ConfigRestriccionPago> obtenerTodos() {
        return configRestriccionPagoDAO.obtenerTodos();
    }

    public ConfigRestriccionPago obtenerID(Integer id) {
        return configRestriccionPagoDAO.obtenerID(id);
    }

    @Transactional
    public ConfigRestriccionPago suscribir(ConfigRestriccionPago entidad) {
        entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecmodif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.TRUE);

        return configRestriccionPagoDAO.suscribir(entidad);
    }

    @Transactional
    public ConfigRestriccionPago actualizacion(ConfigRestriccionPago entidad) {
        entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecmodif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.TRUE);

        return configRestriccionPagoDAO.actualizacion(entidad);
    }

    @Transactional
    public void borrar(ConfigRestriccionPago entidad) {
        entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecmodif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.FALSE);

        configRestriccionPagoDAO.actualizacion(entidad);
    }

    public List<ConfigRestriccionPago> buscar(FormaPago formaPago,
            RestriccionPago restriccionPago, Empresa empresa) {
        return configRestriccionPagoDAO.buscar(formaPago, restriccionPago, empresa);
    }

    public boolean puedoDarDeAlta(ConfigRestriccionPago configRestriccionPago) {
        if (configRestriccionPago == null) {
            throw new IllegalArgumentException("Debe de informar la configuracion de restricción");
        }
        if ((configRestriccionPago.getFormaPago() == null) || (configRestriccionPago.getRestriccion() == null)) {
            throw new IllegalArgumentException("Debe de informar los atributos formaPago y Restriccion");
        }
        Map<Integer, ConfigRestriccionPago> mapConsulta = configRestriccionPagoDAO.buscar(configRestriccionPago.getFormaPago());

        if (!mapConsulta.isEmpty()) {

            if (configRestriccionPago.getConfigrestriccionId() != null) {
                Collection<ConfigRestriccionPago> values = mapConsulta.values();
                Integer restriccionId = null;
                for (ConfigRestriccionPago c : values) {
                    if (c.equals(configRestriccionPago) || (!c.getRestriccion().getRestriccionId().equals(configRestriccionPago.getRestriccion().getRestriccionId()))) {
                        restriccionId = c.getRestriccion().getRestriccionId().intValue();
                    }
                }
                if (restriccionId != null) {
                    mapConsulta.remove(restriccionId);
                }
            }

            if ((configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_CANCELABLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_NO_CANCELABLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_NO_CANCELABLE)))
                    || (configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_NO_CANCELABLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_CANCELABLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_CANCELABLE)))) {

                return false;
            }

            if ((configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_TRANSFERIBLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_NO_TRANSFERIBLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_NO_TRANSFERIBLE)))
                    || (configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_NO_TRANSFERIBLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_TRANSFERIBLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_TRANSFERIBLE)))) {
                return false;
            }

            if ((configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_RESERVABLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_NO_RESERVABLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_NO_RESERVABLE)))
                    || (configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_NO_RESERVABLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_RESERVABLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_RESERVABLE)))) {
                return false;
            }



            if (configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_RESERVABLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_RESERVABLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_RESERVABLE))) {
                return false;
            }
            if (configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_TRANSFERIBLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_TRANSFERIBLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_TRANSFERIBLE))) {
                return false;
            }
            if (configRestriccionPago.getRestriccion().getRestriccionId().equals(RESTRICCION_CANCELABLE.shortValue())
                    && (mapConsulta.get(RESTRICCION_CANCELABLE) != null) && isMesmaEmpresaOrEmpresaTodas(configRestriccionPago, mapConsulta.get(RESTRICCION_CANCELABLE))) {
                return false;
            }

        }

        return true;
    }

	private boolean isMesmaEmpresaOrEmpresaTodas(ConfigRestriccionPago configRestriccionPago, ConfigRestriccionPago configRestriccionPagoExistente) {
		return configRestriccionPagoExistente.getEmpresa() == null || 
			   configRestriccionPagoExistente.getEmpresa().getEmpresaId() == -1 ||
			   configRestriccionPago.getEmpresa() == null || 
			   configRestriccionPago.getEmpresa().getEmpresaId() == -1 ||			   
			   configRestriccionPago.getEmpresa().equals(configRestriccionPagoExistente.getEmpresa());
	}

   
}
