package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
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 com.jasamedika.medifirst2000.dao.OrderPelayananDao;
import com.jasamedika.medifirst2000.dao.StrukOrderDao;
import com.jasamedika.medifirst2000.dto.PemakaianRumahDukaDto;
import com.jasamedika.medifirst2000.entities.StrukOrder;
import com.jasamedika.medifirst2000.enums.Status;
import com.jasamedika.medifirst2000.service.DaftarPemakaianRumahDukaService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.PemakaianRumahDukaVO;

@Service("daftarPemakaianRumahDukaService")
public class DaftarPemakaianRumahDukaServiceImpl implements DaftarPemakaianRumahDukaService {

	@Autowired
	private OrderPelayananDao orderPelayananDao;

	@Autowired
	private StrukOrderDao strukOrderDao;

	@Override
	public Map<String, Object> findDaftarPemakaianRumahDukaByPeriode(String periodeAwal, String periodeAkhir) {
		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("==================START GET PEMAKAIAN RUMAH DUKA BY PERIODE======================");
			List<PemakaianRumahDukaDto> dtoList = new ArrayList<PemakaianRumahDukaDto>();
			List<Map<String, Object>> resultMap = orderPelayananDao.findDaftarPemakaianRumahDukaByPeriode(periodeAwal,
					periodeAkhir);
			for (int i = 0; i < resultMap.size(); i++) {
				PemakaianRumahDukaDto dto = new PemakaianRumahDukaDto();
				dto.setNoRecStrukOrder(resultMap.get(i).get("noRecStrukOrder").toString());
				dto.setNoOrder(resultMap.get(i).get("noOrder").toString());
				dto.setTglOrder(DateUtil.toDate(resultMap.get(i).get("tglOrder").toString()));
				dto.setNamaPenyewa(resultMap.get(i).get("namaPenyewa").toString());
				dto.setNoKtp(resultMap.get(i).get("noKtp").toString());
				dto.setNoTelp(resultMap.get(i).get("noTelp").toString());
				dto.setAlamat(resultMap.get(i).get("alamat").toString());
				dto.setTglPelayananAwal(DateUtil.toDate(resultMap.get(i).get("tglSewaAwal").toString()));
				dto.setTglPelayananAkhir(DateUtil.toDate(resultMap.get(i).get("tglSewaAkhir").toString()));
				dto.setNamaProdukId(Integer.parseInt(resultMap.get(i).get("namaProdukId").toString()));
				dto.setNamaProduk(resultMap.get(i).get("namaPelayanan").toString());
				dto.setKamarId(Integer.parseInt(resultMap.get(i).get("kamarId").toString()));
				dto.setNamaKamar(resultMap.get(i).get("namaKamar").toString());
				dto.setTotalHargaSatuan(Double.parseDouble(resultMap.get(i).get("totalHargaSatuan").toString()));
				dto.setStatus(resultMap.get(i).get("status").toString());
				dto.setListPenambahan(new ArrayList<Map<String, Object>>());
				// get penambahan kebutuhan sarana
				List<Map<String, Object>> listPenambahan = orderPelayananDao
						.findPenambahanKebutuhanSarana(dto.getNoRecStrukOrder());
				for (Map<String, Object> list : listPenambahan) {
					Map<String, Object> dataPenambahan = new HashMap<String, Object>();
					dataPenambahan.put("namaBarang", list.get("namaBarang").toString());
					dataPenambahan.put("jumlah", list.get("jumlah").toString());
					dataPenambahan.put("harga", list.get("harga").toString());
					dataPenambahan.put("satuan", list.get("satuan").toString());
					dto.getListPenambahan().add(dataPenambahan);
				}
				dtoList.add(dto);
			}
			result.put("result", dtoList);
			System.out.println("==================END GET PEMAKAIAN RUMAH DUKA BY PERIODE======================");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	@Override
	public Map<String, Object> findByNoRec(String noRec) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("============START DAFTAR ORDER PEMAKAIAN RUMAH DUKA BY NO REC============");
	
			List<Map<String, Object>> dtoList = new ArrayList<>();
		
			List<Map<String, Object>> resultMap = orderPelayananDao.findDaftarRumahDukaByNoRecRev1(noRec);
			for (Map<String, Object> item : resultMap) {
				item.put("listPenambahan", this.orderPelayananDao.findPenambahanKebutuhanSarana((String)item.get("noRecStrukOrder")));
				item.put("pelayanan", this.orderPelayananDao.getJenisPelayananbyNoRec((String)item.get("noRecStrukOrder")));
				item.put("ruangan", this.orderPelayananDao.getJenisKamarbyNoRec((String)item.get("noRecStrukOrder")));
				dtoList.add(item);
			}
	
			result.put("result", dtoList);
			System.out.println("============END DAFTAR ORDER PEMAKAIAN RUMAH DUKA BY NO REC============");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> saveStatusRumahDuka(String noRec, PemakaianRumahDukaVO vo) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("==================START SAVE STATUS PEMAKAIAN RUMAH DUKA======================");
			// set status from DIPAKAI to SELESAI DIPAKAI
			StrukOrder strukOrder = strukOrderDao.findStatusDipakai(noRec);
			// set status untuk struk order
			if (strukOrder.getStatus().equals("DIPAKAI")) {
				strukOrder.setStatus(Status.SELESAI.getVal());
			}
			if (CommonUtil.isNotNullOrEmpty(vo.getStrukOrder())) {
				strukOrder.setTglKeluar(vo.getStrukOrder().getTglKeluar());
			}
			StrukOrder resultModelStrukOrder = strukOrderDao.save(strukOrder);
			result.put("noRecStrukOrder", resultModelStrukOrder.getNoRec());
			System.out.println("==================END SAVE STATUS PEMAKAIAN RUMAH DUKA======================");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	@Override
	public Map<String, Object> getAllDaftarPemakaianRumahDuka() {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("==================START GET ALL PEMAKAIAN RUMAH DUKA======================");
			List<PemakaianRumahDukaDto> dtoList = new ArrayList<PemakaianRumahDukaDto>();
			List<Map<String, Object>> resultMap = orderPelayananDao.getAllDaftarPemakaianRumahDuka();
			for (int i = 0; i < resultMap.size(); i++) {
				PemakaianRumahDukaDto dto = new PemakaianRumahDukaDto();
				dto.setNoRecStrukOrder(resultMap.get(i).get("noRecStrukOrder").toString());
				dto.setNoOrder(resultMap.get(i).get("noOrder").toString());
				dto.setNamaPenyewa(resultMap.get(i).get("namaPenyewa").toString());
				dto.setNoKtp(resultMap.get(i).get("noKtp").toString());
				dto.setNoTelp(resultMap.get(i).get("noTelp").toString());
				dto.setAlamat(resultMap.get(i).get("alamat").toString());
				dto.setTglPelayananAwal(DateUtil.toDate(resultMap.get(i).get("tglSewaAwal").toString()));
				dto.setTglPelayananAkhir(DateUtil.toDate(resultMap.get(i).get("tglSewaAkhir").toString()));
				dto.setNamaProdukId(Integer.parseInt(resultMap.get(i).get("namaProdukId").toString()));
				dto.setNamaProduk(resultMap.get(i).get("namaPelayanan").toString());
				dto.setKamarId(Integer.parseInt(resultMap.get(i).get("kamarId").toString()));
				dto.setNamaKamar(resultMap.get(i).get("namaKamar").toString());
				dto.setTotalHargaSatuan(Double.parseDouble(resultMap.get(i).get("totalHargaSatuan").toString()));
				dto.setStatus(resultMap.get(i).get("status").toString());
				dto.setListPenambahan(new ArrayList<Map<String, Object>>());
				// get penambahan kebutuhan sarana
				List<Map<String, Object>> listPenambahan = orderPelayananDao
						.findPenambahanKebutuhanSarana(dto.getNoRecStrukOrder());
				for (Map<String, Object> list : listPenambahan) {
					Map<String, Object> dataPenambahan = new HashMap<String, Object>();
					dataPenambahan.put("namaBarang", list.get("namaBarang").toString());
					dataPenambahan.put("jumlah", list.get("jumlah").toString());
					dataPenambahan.put("harga", list.get("harga").toString());
					dataPenambahan.put("satuan", list.get("satuan").toString());
					dto.getListPenambahan().add(dataPenambahan);
				}
				dtoList.add(dto);
			}
			result.put("result", dtoList);
			System.out.println("==================END GET ALL PEMAKAIAN RUMAH DUKA======================");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

}
