package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
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;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.ItJadwalPerawatanDao;
import com.jasamedika.medifirst2000.dao.ItJadwalPerawatanItemDao;
import com.jasamedika.medifirst2000.dao.ItJadwalPerawatanTeknisiDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.RegistrasiAsetDao;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.StrukOrderDao;
import com.jasamedika.medifirst2000.dao.custom.ItJadwalPerawatanDaoCustom;
import com.jasamedika.medifirst2000.dto.ItJadwalPerawatanDto;
import com.jasamedika.medifirst2000.dto.ItJadwalPerawatanItemDto;
import com.jasamedika.medifirst2000.dto.ItJadwalPerawatanTeknisiDto;
import com.jasamedika.medifirst2000.entities.ItJadwalPerawatan;
import com.jasamedika.medifirst2000.entities.ItJadwalPerawatanItem;
import com.jasamedika.medifirst2000.entities.ItJadwalPerawatanTeknisi;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.RegistrasiAset;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.StrukOrder;
import com.jasamedika.medifirst2000.service.ItJadwalPerawatanService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.RegistrasiAsetVO;

@Service("ItJadwalPerawatanService")
public class ItJadwalPerawatanServiceImpl implements ItJadwalPerawatanService {
	@Autowired
	private ItJadwalPerawatanDao itJadwalPerawatanDao;
	
	@Autowired
	private RuanganDao ruanganDao; 
	
	@Autowired
	private PegawaiDao pegawaiDao;  
	
	@Autowired
	private StrukOrderDao strukOrderDao;
	
	@Autowired
	private RegistrasiAsetDao registrasiAsetDao;
	
	@Autowired
	private ItJadwalPerawatanItemDao itJadwalPerawatanItemDao;
	
	@Autowired
	private ItJadwalPerawatanTeknisiDao itJadwalPerawatanTeknisiDao;
	
	@Autowired
	private ItJadwalPerawatanDaoCustom itJadwalPerawatanDaoCustom;
	
	@Autowired
	private BaseConverterImpl <RegistrasiAsetVO, RegistrasiAset> registrasiAsetConverter;
	
//	@Override
//	public Map<String, Object> getNoOrderTable(){
//		Map<String, Object> result = new HashMap<>();
//		List<String> list = itJadwalPerawatanDao.noOrder();
//		
//		if(CommonUtil.isNotNullOrEmpty(list)){
//			Integer data = Integer.parseInt(list.get(list.size()-1).substring(2))+1;
//			result.put("noOrder", "PR"+data);
//		} else{
//			result.put("noOrder", noOrderPerbaikan());
//		}
//		return result;
//	}
	
	@Override
	public String noOrderPerbaikan() {
		Date dateNow=new Date();
		Integer month=DateUtil.getMonthFromDate(dateNow);
		Integer year=DateUtil.getYearFromDate(dateNow);
		Long count=itJadwalPerawatanDao.count();
		
		String monthNow=month.toString();
		String yearNow=year.toString().substring(2, 4);
		String noOrder=null;
		
		count++;
		if(count.toString().length()==1){
			noOrder="000";}
		else if(count.toString().length()==2){
			noOrder="00";}
		else if(count.toString().length()==3){
			noOrder="0";}
		if(monthNow.length()==1)
			monthNow = "0"+monthNow;

		return "PR"+yearNow+monthNow+noOrder+count;
	}

	@Override
	@Transactional
	public Map<String, Object> saveJadwalPerawatan(ItJadwalPerawatanDto dto) {
		Map<String, Object> result = new HashMap<>();
		StrukOrder strukOrder = new StrukOrder();
		strukOrder.setNoOrder(noOrderPerbaikan());
		strukOrder.setTglOrder(dto.getTanggal());
		strukOrder.setIsDelivered((byte) 1);
				
		strukOrder.setKeteranganKeperluan(dto.getKeterangan());
		strukOrder.setKeteranganOrder("Jadwal Perawatan IT");
		Ruangan ruangan = this.ruanganDao.findById(dto.getRuanganId());
		strukOrder.setRuangan(ruangan);
		Pegawai pegawai = this.pegawaiDao.findById(dto.getPegawaiId());
		strukOrder.setPegawaiOrder(pegawai);
		strukOrder.setQtyJenisProduk(0.00);
		strukOrder.setQtyProduk(0.00);
		strukOrder.setTotalBeaMaterai(0.00);
		strukOrder.setTotalBiayaKirim(0.00);
		strukOrder.setTotalBiayaTambahan(0.00);
		strukOrder.setTotalDiscount(0.00);
		strukOrder.setTotalHargaSatuan(0.00);
		strukOrder.setTotalHarusDibayar(0.00);
		strukOrder.setTotalPph(0.00);
		strukOrder.setTotalPpn(0.00);
		StrukOrder strukOrderResult = this.strukOrderDao.save(strukOrder);
		
		if(strukOrderResult.getNoRec()!=null){
			ItJadwalPerawatan itJadwalPerawatan = new ItJadwalPerawatan(); 
			itJadwalPerawatan.setStrukOrder(strukOrderResult);
			itJadwalPerawatan.setRuangan(ruangan);
			itJadwalPerawatan.setTanggal(dto.getTanggal());
			itJadwalPerawatan.setTglJadwal(dto.getTglJadwal());
			itJadwalPerawatan.setStatusPengerjaan("Belum Dikerjakan");
			itJadwalPerawatan.setKeterangan(dto.getKeterangan());
			itJadwalPerawatan.setStatusEnabled(true);
			itJadwalPerawatan = this.itJadwalPerawatanDao.save(itJadwalPerawatan);
			
			if(itJadwalPerawatan.getNoRec()!=null){
				//set untuk asset/produk untuk dijadwalkan
				for(ItJadwalPerawatanItemDto item:dto.getItJadwalItem()) {
					ItJadwalPerawatanItem itJadwalPerawatanItem = new ItJadwalPerawatanItem();
					itJadwalPerawatanItem.setItJadwalPerawatan(itJadwalPerawatan);
					RegistrasiAsetVO registrasiAset = new RegistrasiAsetVO();
					registrasiAset.setNoRec(item.getRegistrasiAsetId());
					if(CommonUtil.isNotNullOrEmpty(registrasiAset)){
						itJadwalPerawatanItem.setRegistrasiAset(registrasiAsetConverter.transferVOToModel(registrasiAset, new RegistrasiAset()));
					}
					
					itJadwalPerawatanItem.setKondisi("Baik");
					itJadwalPerawatanItem.setStatusEnabled(true);
					itJadwalPerawatanItem = this.itJadwalPerawatanItemDao.save(itJadwalPerawatanItem);
				}
				
				//set Teknisi
				for(ItJadwalPerawatanTeknisiDto itemTeknisi:dto.getItJadwalTeknisi()){
					ItJadwalPerawatanTeknisi itJadwalPerawatanTeknisi = new ItJadwalPerawatanTeknisi(); 
					itJadwalPerawatanTeknisi.setItJadwalPerawatan(itJadwalPerawatan);
					Pegawai teknisi = this.pegawaiDao.findById(itemTeknisi.getTeknisiId());
					itJadwalPerawatanTeknisi.setTeknisi(teknisi);
					itJadwalPerawatanTeknisi.setStatusEnabled(true);
					itJadwalPerawatanTeknisi = this.itJadwalPerawatanTeknisiDao.save(itJadwalPerawatanTeknisi);
				}
			}
		}
		
		if(strukOrderResult.getNoRec()!=null){
			result.put("noRec", strukOrderResult.getNoRec());
		}

		return result;
	}

	@Override
	public Map<String, Object> getJadwalPerawatanAll(Integer page, Integer limit, String sort, String dir,String startDate, String endDate,String statusPemeliharaan) {
		if(CommonUtil.isNullOrEmpty(startDate)){
			startDate="1900-01-01";
			endDate="2100-10-10";
		}else if(CommonUtil.isNullOrEmpty(endDate)){
			endDate="2100-10-10";
		}
		
//		Map<String, Object> result = new HashMap<>();
//		result.put("data", this.itJadwalPerawatanDao.getJadwalPerawatanAll(startDate, endDate));
//		return result;
		
		int totalRow = itJadwalPerawatanDaoCustom.getCountJadwalPerawatan(startDate,endDate,statusPemeliharaan);
		int totalPages = 0;

		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		
		Map<String, Object> result=new HashMap<String,Object>();
		result.put("data", itJadwalPerawatanDaoCustom.getJadwalPerawatanAll(rowStart, rowEnd, sort, dir,startDate,endDate,statusPemeliharaan));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}

	@Override
	public Map<String, Object> getJadwalPerawatanbyNoRec(String noRec) {
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> list = new ArrayList<>();
		
		List<Map<String, Object>> dataJadwal = this.itJadwalPerawatanDao.getJadwalPerawatanByNoRec(noRec);
		for(Map<String, Object> item:dataJadwal){
			item.put("teknisi", this.itJadwalPerawatanDao.getTeknisiJadwalPerawatanByNoRec((String)item.get("noRec")));
			item.put("registrasiAset", this.itJadwalPerawatanDao.getProdukJadwalPerawatanByNoRec((String)item.get("noRec")));
			list.add(item);
		}
		
		result.put("data", list);
		return result;
	}

	@Override
	@Transactional
	public Map<String, Object> saveRealisasiJadwalPerawatan(ItJadwalPerawatanDto dto) {
		Map<String, Object> result = new HashMap<>();
		
		ItJadwalPerawatan itJadwalPerawatan = this.itJadwalPerawatanDao.findOne(dto.getNoRec());
		itJadwalPerawatan.setStatusPengerjaan(dto.getStatusPengerjaan());
		itJadwalPerawatan.setTglPelaksanaan(dto.getTglPelaksanaan());
		itJadwalPerawatan.setKeterangan(dto.getKeterangan());
		ItJadwalPerawatan itJadwalPerawatanResult = this.itJadwalPerawatanDao.save(itJadwalPerawatan);
		
		if(itJadwalPerawatanResult.getNoRec()!=null){
			
			//asetitem
			for(ItJadwalPerawatanItemDto itemAset:dto.getItJadwalItem()){
				ItJadwalPerawatanItem itJadwalPerawatanItem = this.itJadwalPerawatanItemDao.findOne(itemAset.getNoRecAset());
				itJadwalPerawatanItem.setKondisi(itemAset.getKondisi());
				itJadwalPerawatanItem = this.itJadwalPerawatanItemDao.save(itJadwalPerawatanItem);	
			}
				
			//teknisi
			for(ItJadwalPerawatanTeknisiDto itemTeknisi:dto.getItJadwalTeknisi()){
				ItJadwalPerawatanTeknisi itJadwalPerawatanTeknisi = new ItJadwalPerawatanTeknisi();
				itJadwalPerawatanTeknisi.setNoRec(itemTeknisi.getNoRecTeknisi());
				itJadwalPerawatanTeknisi.setItJadwalPerawatan(itJadwalPerawatan);
				Pegawai teknisi = this.pegawaiDao.findById(itemTeknisi.getTeknisiId());
				itJadwalPerawatanTeknisi.setTeknisi(teknisi);
				itJadwalPerawatanTeknisi.setStatusEnabled(itemTeknisi.getStatusEnabled());
				itJadwalPerawatanTeknisi = this.itJadwalPerawatanTeknisiDao.save(itJadwalPerawatanTeknisi);
			}
		}
		
		if(itJadwalPerawatanResult.getNoRec()!=null){
			result.put("data", itJadwalPerawatanResult.getNoRec());
		}
		
		return result;
	}
	
	@Override
	public Boolean deleteJadwalPerawatan(String noRec){
		ItJadwalPerawatan itJadwalPerawatan = new ItJadwalPerawatan();
		if(CommonUtil.isNotNullOrEmpty(noRec)){
			itJadwalPerawatan = itJadwalPerawatanDao.findOne(noRec);
			itJadwalPerawatan.setStatusEnabled(false);
			itJadwalPerawatanDao.save(itJadwalPerawatan);

			return true;
		} else{
			return false;
		}
	}
	
	@Override
	public List<Map<String, Object>> listLembarKerjaPemeliharaanBarangITI(String noRec) {
			List<Map<String, Object>> dataJadwal = itJadwalPerawatanDao.getLembarKerjaPemeliharaanBarangITI(noRec);

			List<Map<String, Object>> list = new ArrayList<>();
			List<Map<String, Object>> detailProduk = new ArrayList<>();
			Map<String, Object> tempMap;
			
			for(Map<String, Object> item:dataJadwal){
				String jenisProduk = (String) item.get("jenisProduk");
				
				 if(jenisProduk.equalsIgnoreCase("Komputer Unit")||jenisProduk=="Komputer Unit"){
					 detailProduk = new ArrayList<>();
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", "Monitor");
					 tempMap.put("no", 1);
					 detailProduk.add(tempMap);
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", "CPU");
					 tempMap.put("no", 2);
					 detailProduk.add(tempMap);
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", "Keyboard");
					 tempMap.put("no", 3);
					 detailProduk.add(tempMap);
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", "Mouse");
					 tempMap.put("no", 4);
					 detailProduk.add(tempMap);
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", "Cek Update Antivirus");
					 tempMap.put("no", 5);
					 detailProduk.add(tempMap);
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", "Cek Jaringan Kabel");
					 tempMap.put("no", 6);
					 detailProduk.add(tempMap);
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", "Printer");
					 tempMap.put("no", 7);
					 detailProduk.add(tempMap);
				 }else{
					 detailProduk = new ArrayList<>();
					 tempMap = new HashMap<>();
					 tempMap.put("bagianAlat", jenisProduk);
					 tempMap.put("no", 1);
					 detailProduk.add(tempMap);
				 }
				item.put("bagianAlat", detailProduk); 
				list.add(item);
			}
			
		return list;
	}
	
	

}
