package com.jasamedika.medifirst2000.service.test;

import static org.junit.Assert.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import com.jasamedika.medifirst2000.converter.PasienConverter;
import com.jasamedika.medifirst2000.converter.RegistrasiPelayananPasienConverter;
import com.jasamedika.medifirst2000.dao.PasienDao;
import com.jasamedika.medifirst2000.dao.RegistrasiPelayananPasienDao;
import com.jasamedika.medifirst2000.entities.PapKeluhanTambahan;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.RegistrasiPelayananPasien;
import com.jasamedika.medifirst2000.service.PapKeluhanTambahanService;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.PapKeluhanTambahanVO;
import com.jasamedika.medifirst2000.vo.PasienVO;
import com.jasamedika.medifirst2000.vo.RegistrasiPelayananPasienVO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:com/jasamedika/**/applicationContext.xml")
public class PapKeluhanTambahanServiceImplTest {

	@Autowired
	private PapKeluhanTambahanService papKeluhanTambahanService;
	@Autowired
	private PasienDao pasienDao;
	@Autowired
	private RegistrasiPelayananPasienDao registrasiPelayananpasienDao;
	@Autowired
	private PasienConverter pasienConverter;
	@Autowired
	private RegistrasiPelayananPasienConverter registrasiPelayananPasienConverter;
	
	@Test
	@Transactional
	public void testAddKeluhanTambahan() throws ParseException {
		PapKeluhanTambahanVO papKeluhanTambahanVO = populateModelVO();
		assertNotNull(papKeluhanTambahanVO);
		Map<String,Object> result = papKeluhanTambahanService.addKeluhanTambahan(papKeluhanTambahanVO);
		assertNotNull(result);
		assertEquals("Keluhan tambahan",((PapKeluhanTambahan) result.get("papKeluhanTambahan")).getKeluhanTambahan());
		//assertEquals("Setyo Wibudi",((PapKeluhanTambahan) result.get("papKeluhanTambahan")).getPasien().getNamaPasien());
		
	}
	
	@Test
	@Transactional
	public void testUpdateKeluhanTambahan() throws ParseException {
		PapKeluhanTambahanVO papKeluhanTambahanVO = populateModelVO();
		Map<String,Object> result = papKeluhanTambahanService.addKeluhanTambahan(papKeluhanTambahanVO);
		assertNotNull(result);
		
		PapKeluhanTambahanVO papKeluhanTambahanVOUpdate = populateModelVOUpdate();
		papKeluhanTambahanVOUpdate.setNoRec(((PapKeluhanTambahan) result.get("papKeluhanTambahan")).getNoRec());
		assertNotNull(papKeluhanTambahanVOUpdate);
		assertEquals(papKeluhanTambahanVOUpdate.getNoRec(),((PapKeluhanTambahan) result.get("papKeluhanTambahan")).getNoRec());
		
		Map<String,Object> resultUpdate = papKeluhanTambahanService.addKeluhanTambahan(papKeluhanTambahanVOUpdate);
		assertEquals(false,((PapKeluhanTambahan) resultUpdate.get("papKeluhanTambahan")).getStatusEnabled());
		assertEquals("Keluhan tambahan update",((PapKeluhanTambahan) resultUpdate.get("papKeluhanTambahan")).getKeluhanTambahan());
	}
	
	
	@Test
	public void testFindByNoCmAndTglInput() {
		String noCm = "000000000000005";
		String tglInput = "2016-07-21 00:24:30";
		Map<String,Object> result = papKeluhanTambahanService.findByNoCmAndTglInput(noCm, DateUtil.toDate(tglInput));
		assertNotNull(result);
		Boolean dataFound=new Boolean((boolean) result.get("dataFound"));
		assertTrue(dataFound);
		assertEquals("keluhan Pertama",((PapKeluhanTambahan) result.get("papKeluhanTambahan")).getKeluhanTambahan());
	}
	
	@Test
	public void testFindPasienByNoCmAndTglKeluhan() {
		String noCm = "000000000000005";
		String tglKeluhan = "2016-07-21 00:23:37";
		Map<String,Object> result = papKeluhanTambahanService.findByNoCmAndTglkeluhan(DateUtil.toDate(tglKeluhan), noCm);
		assertNotNull(result);
		Boolean dataFound=new Boolean((boolean) result.get("dataFound"));
		assertTrue(dataFound);
		//assertEquals("keluhan pertama",((PapKeluhanTambahan) result.get("papKeluhanTambahan")).getKeluhanTambahan());
		
	}
	
	private PapKeluhanTambahanVO populateModelVO() throws ParseException{
		PapKeluhanTambahanVO papKeluhanTambahanVO = new PapKeluhanTambahanVO();
		Pasien pasien = pasienDao.findOne(547);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		
		RegistrasiPelayananPasien registrasiPelayananPasien = registrasiPelayananpasienDao.findOne("2c9090ad56014d2c0156014f2f020003");
		RegistrasiPelayananPasienVO registrasiPelayananPasienVO = registrasiPelayananPasienConverter.transferModelToVO(registrasiPelayananPasien,new RegistrasiPelayananPasienVO());
		
		//papKeluhanTambahanVO.setRegistrasiPelayananPasien(registrasiPelayananPasienVO);
	//	papKeluhanTambahanVO.setPasien(pasienVO);
		papKeluhanTambahanVO.setKeluhanTambahan("Keluhan tambahan");
		papKeluhanTambahanVO.setTglInput(generateDate());
		papKeluhanTambahanVO.setTglMerasaKeluhan(generateDate());
		papKeluhanTambahanVO.setStatusEnabled(true);
		
		return papKeluhanTambahanVO;
	}
	
	private PapKeluhanTambahanVO populateModelVOUpdate() throws ParseException{
		PapKeluhanTambahanVO papKeluhanTambahanVO = new PapKeluhanTambahanVO();
		Pasien pasien = pasienDao.findOne(547);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		
		RegistrasiPelayananPasien registrasiPelayananPasien = registrasiPelayananpasienDao.findOne("2c9090ad56014d2c0156014f2f020003");
		RegistrasiPelayananPasienVO registrasiPelayananPasienVO = registrasiPelayananPasienConverter.transferModelToVO(registrasiPelayananPasien,new RegistrasiPelayananPasienVO());
		
		//papKeluhanTambahanVO.setRegistrasiPelayananPasien(registrasiPelayananPasienVO);
		papKeluhanTambahanVO.setTglInput(generateDate());
		papKeluhanTambahanVO.setTglMerasaKeluhan(generateDate());
		//papKeluhanTambahanVO.setPasien(pasienVO);
		papKeluhanTambahanVO.setStatusEnabled(false);
		papKeluhanTambahanVO.setKeluhanTambahan("Keluhan tambahan update");
		
		return papKeluhanTambahanVO;
	}
	
	@Test
	public void testPopulate() throws ParseException{
		/*Cek Method Populate*/
		PapKeluhanTambahanVO papKeluhanTambahanVO = populateModelVO();
		assertNotNull(papKeluhanTambahanVO);
		
		
		/*Cek Dao*/
		Pasien pasien = pasienDao.findOne(544);
		assertNotNull(pasien);
		assertEquals("Reynaldi Ramadhani Pratama",pasien.getNamaPasien());
		
		/*Cek Converter*/
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		assertNotNull(pasienVO);
		assertEquals("Reynaldi Ramadhani Pratama",pasienVO.getNamaPasien());
		
		assertEquals("Keluhan tambahan",papKeluhanTambahanVO.getKeluhanTambahan());
	}
	
	private Date generateDate() throws ParseException{
		SimpleDateFormat formatter = new SimpleDateFormat("EEEE, MMM dd, yyyy HH:mm:ss a");
		String dateInString = "Friday, Jun 7, 2013 11:40:39 PM";		

		Date date = formatter.parse(dateInString);
		return date;

	}

}
