/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
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.PricingEspecificoDAO;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PricingEspecifico;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoAgencia;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoCanalVendas;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoCategoria;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoOcupacion;
import com.rjconsultores.ventaboletos.service.PricingEspecificoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 *
 * @author Rafius
 */
@Service("pricingEspecificoService")
public class PricingEspecificoServiceImpl implements PricingEspecificoService {

    @Autowired
    private PricingEspecificoDAO pricingEspecificoDAO;

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

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

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

        return pricingEspecificoDAO.suscribir(entidad);
    }

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

        return pricingEspecificoDAO.actualizacion(entidad);
    }

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

        pricingEspecificoDAO.actualizacion(entidad);
    }

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

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

		PricingEspecifico pricingToClone = obtenerID(id);
		PricingEspecifico clonePricing = new 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.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

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

	private List<PricingEspecificoAgencia> getPricingEspecificoAgenciasList(PricingEspecifico pricingToClone, PricingEspecifico clonePricing) {

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

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

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

				toReturn.add(newPricingAgencia);
			}
		}

		return toReturn;
	}
	
	private List<PricingEspecificoCanalVendas> getPricingEspecificoCanalVendasList(PricingEspecifico pricingToClone, PricingEspecifico clonePricing) {

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

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

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

				toReturn.add(newCanalVendas);
			}
		}

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

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

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

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

				toReturn.add(newCategoria);
			}
		}

		return toReturn;
	}
	
	private List<PricingEspecificoOcupacion> getPricingEspecificoOcupacion(PricingEspecifico pricingToClone, PricingEspecifico clonePricing){
		
		List<PricingEspecificoOcupacion> list = new ArrayList<PricingEspecificoOcupacion>();
		
		for(PricingEspecificoOcupacion peo : pricingToClone.getPricingEspecificoOcupacionsList()){
			PricingEspecificoOcupacion newPeo = new 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<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);
	}
}
