package com.jasamedika.medifirst2000.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;

import com.jasamedika.medifirst2000.converter.base.BaseVoConverter;
import com.jasamedika.medifirst2000.dao.RencanaKinerjaOperasionalDao;
import com.jasamedika.medifirst2000.dao.RencanaKinerjaTahunanDao;
import com.jasamedika.medifirst2000.dao.custom.RencanaKinerjaTahunanDaoCustom;
import com.jasamedika.medifirst2000.entities.Departemen;
import com.jasamedika.medifirst2000.entities.KamusIndikator;
import com.jasamedika.medifirst2000.entities.MasterProgramKerjaStrategis;
import com.jasamedika.medifirst2000.entities.RencanaKinerjaOperasional;
import com.jasamedika.medifirst2000.entities.RencanaKinerjaTahunan;
import com.jasamedika.medifirst2000.entities.SasaranStrategis;
import com.jasamedika.medifirst2000.entities.SatuanIndikator;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.RencanaKinerjaTahunanService;
import com.jasamedika.medifirst2000.vo.RencanaKinerjaOperasionalVO;
import com.jasamedika.medifirst2000.vo.RencanaKinerjaTahunanVO;

@Service("RencanaKinerjaTahunanService")
public class RencanaKinerjaTahunanServiceImpl extends BaseVoServiceImpl implements RencanaKinerjaTahunanService{

	@Autowired
	private BaseVoConverter<RencanaKinerjaTahunanVO, RencanaKinerjaTahunan> rencanaKinerjaTahunanConverter;
	
	@Autowired
	private BaseVoConverter<RencanaKinerjaOperasionalVO, RencanaKinerjaOperasional> rencanaKinerjaOperasionalConverter;
	
	@Autowired
	private RencanaKinerjaTahunanDao rktDao;
	
	@Autowired
	private RencanaKinerjaTahunanDaoCustom rktDaoCustom;
	
	@Autowired
	private RencanaKinerjaOperasionalDao rkoDao;
	
	@Override
	public RencanaKinerjaTahunanVO add(RencanaKinerjaTahunanVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public RencanaKinerjaTahunanVO update(RencanaKinerjaTahunanVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public Boolean delete(String key) throws JpaSystemException {
		return null;
	}

	@Override
	public RencanaKinerjaTahunanVO findById(String key) throws JpaSystemException {
		return null;
	}

	@Override
	public List<RencanaKinerjaTahunanVO> findAll() throws JpaSystemException {
		return null;
	}

	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {
		return null;
	}

	@Override
	public Map<String, Object> save(List<RencanaKinerjaTahunanVO> vos) {
		Map<String,Object> result = new HashMap<String,Object>();
		for(RencanaKinerjaTahunanVO vo : vos){
		RencanaKinerjaTahunan modelRKT = new RencanaKinerjaTahunan();//rencanaKinerjaTahunanConverter.transferVOToModel(vo, new RencanaKinerjaTahunan());
		
		Departemen pic = new Departemen();
		pic.setId(vo.getPic().getId());

		SasaranStrategis sasaran = new SasaranStrategis();
		sasaran.setId(vo.getSasaranStrategis().getId());
		
		SatuanIndikator satuan = new SatuanIndikator();
		satuan.setId(vo.getSatuanIndikator().getId());
		
		MasterProgramKerjaStrategis program = new MasterProgramKerjaStrategis();
		program.setId(vo.getProgramKerjaStrategis().getId());
		
		modelRKT.setRko(null);

		modelRKT.setIndikatorKinerja(vo.getIndikatorKinerja());
		modelRKT.setUraian(vo.getUraian());
		modelRKT.setRencanaKinerjaTahunan(vo.getRencanaKinerjaTahunan());
		modelRKT.setPeriode(vo.getPeriode());
		modelRKT.setPic(pic);
		modelRKT.setSasaranStrategis(sasaran);
		modelRKT.setSatuanIndikator(satuan);
		modelRKT.setProgramKerjaStrategis(program);
		rktDao.save(modelRKT);
		
		for(RencanaKinerjaOperasionalVO voRKO: vo.getRko()){
			RencanaKinerjaOperasional modelRKO = rencanaKinerjaOperasionalConverter.transferVOToModel(voRKO, new RencanaKinerjaOperasional());
			modelRKO.setRencanaKinerjaTahunan(modelRKT);
			rkoDao.save(modelRKO);
//			modelRKT.getRko().add(modelRKO);
		}
		}
//		rktDao.save(modelRKT);
		return result;
	}

	@Override
	public Map<String, Object> findAll(Integer page, Integer take, String sort, String dir,
			Specification<RencanaKinerjaTahunan> spec) {
		Direction direction=null;
		
		if(dir.equalsIgnoreCase("asc")){
			direction=Sort.Direction.ASC;
		}else{
			direction=Sort.Direction.DESC;
		}
		
		Pageable pageable = new PageRequest(page, take, direction, sort);
		Page<RencanaKinerjaTahunan> resultPage = rktDao.findAll(spec, pageable);
		List<RencanaKinerjaTahunan> resultData = resultPage.getContent();
		for(RencanaKinerjaTahunan model : resultData){
			for(RencanaKinerjaOperasional rko : model.getRko()){
				rko.setRencanaKinerjaTahunan(null);
			}
		}
		
		return constructMapReturn(resultData, resultPage.getTotalElements(), resultPage.getTotalPages());
	}

	@Override
	public Map<String, Object> updateRealisasi(List<RencanaKinerjaOperasionalVO> vos) {
		for(RencanaKinerjaOperasionalVO vo : vos){
			RencanaKinerjaOperasional model = rkoDao.findOne(vo.getNoRec());
			model.setRealisasi(vo.getRealisasi());
			rkoDao.save(model);
		}
		return new HashMap<String,Object>();
	}

}
