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.dao.PasienDao;
import com.jasamedika.medifirst2000.entities.PapEliminasi;
import com.jasamedika.medifirst2000.entities.PapGenatalia;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.service.PapEliminasiService;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.PapEliminasiVO;
import com.jasamedika.medifirst2000.vo.PasienVO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:com/jasamedika/**/applicationContext.xml")
public class PapEliminasiServiceImplTest {
	
	@Autowired
	private PapEliminasiService papEliminasiService;
	
	@Autowired
	private PasienDao pasienDao;
	@Autowired
	private PasienConverter pasienConverter;

	@Test
	@Transactional
	public void testAddEliminasi() {
		PapEliminasiVO papEliminasiVO = populateModel();
		Map<String,Object> result = papEliminasiService.addEliminasi(papEliminasiVO);
		assertNotNull(result);
		assertEquals("Diuresis Urin",((PapEliminasi)result.get("papEliminasi")).getDiuresisUrin());
		assertEquals("Frekuensi Defraksi",((PapEliminasi)result.get("papEliminasi")).getFrekuensiDefeaksi());
		assertEquals("Reynaldi Ramadhani Pratama",((PapEliminasi)result.get("papEliminasi")).getPasien().getNamaPasien());
	}

	@Test
	@Transactional
	public void testUpdateEliminasi() {
		PapEliminasiVO papEliminasiVO = populateModel();
		Map<String,Object> result = papEliminasiService.addEliminasi(papEliminasiVO);
		assertNotNull(result);
		
		PapEliminasiVO papEliminasiVOUpdate = populateModelUpdate();
		papEliminasiVOUpdate.setNoRec(((PapEliminasi) result.get("papEliminasi")).getNoRec());
		assertNotNull(papEliminasiVOUpdate);
		assertEquals(papEliminasiVOUpdate.getNoRec(),((PapEliminasi) result.get("papEliminasi")).getNoRec());
		
		Map<String,Object> resultUpdate = papEliminasiService.updateEliminasi(papEliminasiVOUpdate);
		assertNotNull(resultUpdate);
		assertEquals("Diuresis Urin Update",((PapEliminasi)resultUpdate.get("papEliminasi")).getDiuresisUrin());
		assertEquals("Frekuensi Defraksi Update",((PapEliminasi)resultUpdate.get("papEliminasi")).getFrekuensiDefeaksi());
	}

	@Test
	@Transactional
	public void testFindByNoCmAndTglInput() {
		String noCm = "000000000000005";
		String tglInput = "2016-07-17 04:26:00";
		Map<String,Object> result = papEliminasiService.findByNoCmAndTglInput(noCm, DateUtil.toDate(tglInput));
		assertNotNull(result);
		Boolean dataFound=new Boolean((boolean) result.get("dataFound"));
		assertTrue(dataFound);
		
	}
	
	@Test
	@Transactional
	public void testPopulateModel(){
		/*Cek Pasien Dao*/
		Pasien pasien = pasienDao.findOne(544);
		assertNotNull(pasien);
		assertEquals("Reynaldi Ramadhani Pratama",pasien.getNamaPasien());
		
		/*Cek Pasien Converter*/
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		assertNotNull(pasienVO);
		assertEquals("Reynaldi Ramadhani Pratama",pasienVO.getNamaPasien());
		
		/*Cek Populate*/
		PapEliminasiVO papEliminasiVO = populateModel();
		assertNotNull(papEliminasiVO);
		assertEquals("Diuresis Urin",papEliminasiVO.getDiuresisUrin());
		assertEquals("Frekuensi Defraksi",papEliminasiVO.getFrekuensiDefeaksi());
		assertEquals("Reynaldi Ramadhani Pratama",papEliminasiVO.getPasien().getNamaPasien());
	}
	
	private PapEliminasiVO populateModel(){
		PapEliminasiVO papEliminasiVO = new PapEliminasiVO();
		Pasien pasien = pasienDao.findOne(544);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		
		papEliminasiVO.setDiuresisUrin("Diuresis Urin");
		papEliminasiVO.setFrekuensiDefeaksi("Frekuensi Defraksi");
		papEliminasiVO.setTglInput(generateDate());
		papEliminasiVO.setPasien(pasienVO);
		return papEliminasiVO;
	}
	
	private PapEliminasiVO populateModelUpdate(){
		PapEliminasiVO papEliminasiVO = new PapEliminasiVO();
		Pasien pasien = pasienDao.findOne(544);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		
		papEliminasiVO.setDiuresisUrin("Diuresis Urin Update");
		papEliminasiVO.setFrekuensiDefeaksi("Frekuensi Defraksi Update");
		papEliminasiVO.setTglInput(new Date());
		papEliminasiVO.setPasien(pasienVO);
		return papEliminasiVO;
	}
	
	private Date generateDate(){
		SimpleDateFormat formatter = new SimpleDateFormat("EEEE, MMM dd, yyyy HH:mm:ss a");
		String dateInString = "Friday, Jun 7, 2013 12:10:56 PM";
		
		Date date = null;
		try {
			date = formatter.parse(dateInString);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
}
