package com.rjconsultores.ventaboletos.service.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.GP_PricingEspecificoDAO;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.GP_PricingEspecifico;
import com.rjconsultores.ventaboletos.entidad.GP_PricingEspecificoAgencia;
import com.rjconsultores.ventaboletos.entidad.GP_PricingEspecificoCanalVendas;
import com.rjconsultores.ventaboletos.entidad.GP_PricingEspecificoCategoria;
import com.rjconsultores.ventaboletos.entidad.GP_PricingEspecificoOcupacion;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.service.GP_PricingEspecificoService;
import com.rjconsultores.ventaboletos.service.GP_PricingHistoricoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("gp_pricingEspecificoService")
public class GP_PricingEspecificoServiceImpl implements GP_PricingEspecificoService {

    @Autowired
    private GP_PricingEspecificoDAO pricingEspecificoDAO;
    @Autowired
	private GP_PricingHistoricoService pricingHistoricoService;

    public List<GP_PricingEspecifico> obtenerTodos() {
        return pricingEspecificoDAO.obtenerTodos();
    }

    public GP_PricingEspecifico obtenerID(Long id) {
        return pricingEspecificoDAO.obtenerID(id);
    }

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

        return pricingEspecificoDAO.suscribir(entidad);
    }

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

        return pricingEspecificoDAO.actualizacion(entidad);
    }

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

        pricingEspecificoDAO.actualizacion(entidad);
        
        pricingHistoricoService.registarExclusao(entidad, false);
    }

    public List<GP_PricingEspecifico> buscarPorNome(GP_PricingEspecifico pricingEspecifico) {
        return pricingEspecificoDAO.buscarPorNome(pricingEspecifico);
    }
    
	@Override
	public List<GP_PricingEspecifico> buscarPorNome(String nome) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
    @Transactional
	public GP_PricingEspecifico clonarPricing(Long id, String nome, List<GP_PricingEspecificoCategoria> pricingCategoriaList) {

		GP_PricingEspecifico pricingToClone = obtenerID(id);
		GP_PricingEspecifico clonePricing = new GP_PricingEspecifico();
		
		clonePricing.setNombPricing(nome);
		clonePricing.setClaseServicio(pricingToClone.getClaseServicio());
		clonePricing.setCorridaId(pricingToClone.getCorridaId());
		clonePricing.setFechorfin(pricingToClone.getFechorfin());
		clonePricing.setFechorinicio(pricingToClone.getFechorinicio());
		clonePricing.setMarca(pricingToClone.getMarca());
		clonePricing.setMoneda(pricingToClone.getMoneda());
		clonePricing.setParada(pricingToClone.getParada());
		clonePricing.setParada1(pricingToClone.getParada1());
		clonePricing.setPricingEspecificoOcupacionsList(getPricingEspecificoOcupacion(pricingToClone, clonePricing));
		clonePricing.setTarifa(pricingToClone.getTarifa());
		clonePricing.setTarifaredabierto(pricingToClone.getTarifaredabierto());

		clonePricing.setPricingEspecificoAgenciasList(getPricingEspecificoAgenciasList(pricingToClone, clonePricing));
		clonePricing.setPricingEspecificoCanalVendasList(getPricingEspecificoCanalVendasList(pricingToClone, clonePricing));
		clonePricing.setPricingEspecificoCategoriaList(getPricingEspecificoCategoriaList(pricingToClone, clonePricing, pricingCategoriaList));
		
		return suscribir(clonePricing);
	}

	private List<GP_PricingEspecificoAgencia> getPricingEspecificoAgenciasList(GP_PricingEspecifico pricingToClone, GP_PricingEspecifico clonePricing) {

		List<GP_PricingEspecificoAgencia> toReturn = new ArrayList<GP_PricingEspecificoAgencia>();

		for (GP_PricingEspecificoAgencia a : pricingToClone.getPricingEspecificoAgenciasList()) {
			if (a.getActivo()) {
				GP_PricingEspecificoAgencia newPricingAgencia = new GP_PricingEspecificoAgencia();

				newPricingAgencia.setActivo(true);
				newPricingAgencia.setFecmodif(new Date());
				newPricingAgencia.setPricingEspecifico(clonePricing);
				newPricingAgencia.setPuntoVenta(a.getPuntoVenta());
				newPricingAgencia.setUsuarioId(clonePricing.getUsuarioId());

				toReturn.add(newPricingAgencia);
			}
		}

		return toReturn;
	}
	
	private List<GP_PricingEspecificoCanalVendas> getPricingEspecificoCanalVendasList(GP_PricingEspecifico pricingToClone, GP_PricingEspecifico clonePricing) {

		List<GP_PricingEspecificoCanalVendas> toReturn = new ArrayList<GP_PricingEspecificoCanalVendas>();

		for (GP_PricingEspecificoCanalVendas c : pricingToClone.getPricingEspecificoCanalVendasList()) {
			if (c.getActivo()) {
				GP_PricingEspecificoCanalVendas newCanalVendas = new GP_PricingEspecificoCanalVendas();

				newCanalVendas.setActivo(true);
				newCanalVendas.setFecmodif(new Date());
				newCanalVendas.setPricingEspecifico(clonePricing);
				newCanalVendas.setTipoPtovta(c.getTipoPtovta());
				newCanalVendas.setUsuarioId(clonePricing.getUsuarioId());

				toReturn.add(newCanalVendas);
			}
		}

		return toReturn;
	}
	
	private List<GP_PricingEspecificoCategoria> getPricingEspecificoCategoriaList(GP_PricingEspecifico pricingToClone, GP_PricingEspecifico clonePricing, List<GP_PricingEspecificoCategoria> pricingCategoriaList) {

		List<GP_PricingEspecificoCategoria> toReturn = new ArrayList<GP_PricingEspecificoCategoria>();

		for (GP_PricingEspecificoCategoria c : pricingCategoriaList) {
			if (c.getActivo()) {
				GP_PricingEspecificoCategoria newCategoria = new GP_PricingEspecificoCategoria();

				newCategoria.setActivo(true);
				newCategoria.setFecmodif(new Date());
				newCategoria.setPricingEspecifico(clonePricing);
				newCategoria.setCategoria(c.getCategoria());
				newCategoria.setUsuarioId(clonePricing.getUsuarioId());

				toReturn.add(newCategoria);
			}
		}

		return toReturn;
	}
	
	private List<GP_PricingEspecificoOcupacion> getPricingEspecificoOcupacion(GP_PricingEspecifico pricingToClone, GP_PricingEspecifico clonePricing){
		
		List<GP_PricingEspecificoOcupacion> list = new ArrayList<GP_PricingEspecificoOcupacion>();
		
		for(GP_PricingEspecificoOcupacion peo : pricingToClone.getPricingEspecificoOcupacionsList()){
			GP_PricingEspecificoOcupacion newPeo = new GP_PricingEspecificoOcupacion(
			peo.getOcupacioninicial(),
			peo.getOcupacionfinal(),
			peo.getTarifa(),
			peo.getActivo(),
			new Date(),
			UsuarioLogado.getUsuarioLogado().getUsuarioId(),
			peo.getDescuento(),
			clonePricing);
			
			list.add(newPeo);
		}
		
		return list;
	}

	@Override
	public List<GP_PricingEspecifico> buscar(List<Empresa> empresas, List<ClaseServicio> tipoClasses, List<Parada> origens, List<Parada> destinos, Date vigenciaInicial, Date vigenciaFinal) {
		return pricingEspecificoDAO.buscar(empresas, tipoClasses, origens, destinos, vigenciaInicial, vigenciaFinal);
	}
}
