package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;

import com.jasamedika.medifirst2000.converter.JadwalRencanaPemeriksaanConverter;
import com.jasamedika.medifirst2000.dao.JadwalRencanaPemeriksaanDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dto.JadwalPemeriksaanDTO;
import com.jasamedika.medifirst2000.entities.JadwalRencanaPemeriksaan;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.JadwalRencanaPemeriksaanService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.JsonUtil;
import com.jasamedika.medifirst2000.vo.JadwalRencanaPemeriksaanVO;

@Service("JadwalRencanaPemeriksaanService")
public class JadwalRencanaPemeriksaanServiceImpl extends BaseVoServiceImpl implements JadwalRencanaPemeriksaanService{

	@Autowired
	private JadwalRencanaPemeriksaanDao pemeriksaanDao;

	@Autowired
	private PegawaiDao pegawaiDao;
	
	@Autowired
	private JadwalRencanaPemeriksaanConverter converter;

	@Override
	public List<JadwalRencanaPemeriksaanVO> findAll() throws JpaSystemException {
//		List<JadwalRencanaPemeriksaan> models =(List<JadwalRencanaPemeriksaan>) pemeriksaanDao.findAll();
//		Set<DetailJadwalRencanaPemeriksaan> detailJadwalSet=new HashSet<DetailJadwalRencanaPemeriksaan>();
//		DetailJadwalRencanaPemeriksaanVO detailVo= new DetailJadwalRencanaPemeriksaanVO();
//		for(JadwalRencanaPemeriksaan model:models){
//			detailJadwalSet=new HashSet<DetailJadwalRencanaPemeriksaan>();
//			for(DetailJadwalRencanaPemeriksaan detail:model.getDetailJadwalSet()){
//				detailJadwalSet.add(detail);
//			}
//			model.setDetailJadwalSet(detailJadwalSet);
//		}
//		List<JadwalRencanaPemeriksaanVO> vos = converter.transferListOfModelToListOfVO(models, new ArrayList<JadwalRencanaPemeriksaanVO>());
//		return vos;
		
		return null;
		
	}

	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {
		return null;
	}
	
	@Override
	public Map<String,Object> saveJadwal(JadwalRencanaPemeriksaanVO vo){
		Map<String,Object> result = new HashMap<String, Object>();
		JadwalRencanaPemeriksaan model = converter.transferVOToModel(vo, new JadwalRencanaPemeriksaan());
//		model.setPegawai(pegawaiDao.findById(model.getPegawaiId()));
		pemeriksaanDao.save(model);
		return result;
	}
	
	@Override
	public List<JadwalRencanaPemeriksaanVO> findByPegawaiId(Integer id){
//		List<JadwalRencanaPemeriksaan> models = pemeriksaanDao.findByPegawaiId(id);
//		List<JadwalRencanaPemeriksaanVO> vos = converter.transferListOfModelToListOfVO(models, new ArrayList<JadwalRencanaPemeriksaanVO>());
//		return vos;
		return null;
	}
	
	@Override
	public Map<String,Object> findAllJadwal(){
		
		Map<String,Object> result = new HashMap<String,Object>(); 
		List<JadwalRencanaPemeriksaan> resultModel = (List<JadwalRencanaPemeriksaan>) pemeriksaanDao.findAll();
		if(CommonUtil.isNotNullOrEmpty(resultModel)){			
			try {
				result.put("data", JsonUtil.ToMaps(resultModel));
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			result.put("dataFound", true);			
		}else{
			result.put("dataFound", false);
		}		
		return result;
	}
	
	@Override
	public Map<String,Object> findByDateSatuanKerjaId(Integer bulan, Integer tahun, Integer satuanKerjaId){
		Map<String,Object> result = new HashMap<String,Object>(); 
		List<Pegawai> resultModel = (List<Pegawai>) pegawaiDao.findBySatuanKerja2(satuanKerjaId);
		List<JadwalPemeriksaanDTO> jadwal = new ArrayList<JadwalPemeriksaanDTO>();
		
		Date from = new Date();
		Date to = new Date();
		
		Calendar calendar = Calendar.getInstance();
		calendar.clear();
		calendar.set(Calendar.YEAR, tahun);
		calendar.set(Calendar.MONTH,bulan-1);
		from = calendar.getTime();
		
		calendar = Calendar.getInstance();
		calendar.clear();
		calendar.set(Calendar.YEAR,tahun);
		calendar.set(Calendar.MONTH,bulan);
		to = calendar.getTime();
		
		if(CommonUtil.isNotNullOrEmpty(resultModel)){			
			try {
				for(Pegawai model : resultModel){
					JadwalPemeriksaanDTO dto = new JadwalPemeriksaanDTO();
					dto.setPegawai(model);
					List<JadwalRencanaPemeriksaan> list = pemeriksaanDao.findByPegawaiId(from,to,model.getId());
					dto.setJadwalRencanaPemeriksaan(list);
					jadwal.add(dto);
				}
				result.put("data", jadwal);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} 
			result.put("dataFound", true);			
		}else{
			result.put("dataFound", false);
		}		
		return result;
	}

	@Override
	public JadwalRencanaPemeriksaanVO add(JadwalRencanaPemeriksaanVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

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

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

	@Override
	public JadwalRencanaPemeriksaanVO findById(Integer key) throws JpaSystemException {
		return null;
	}
}
