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.PapIntegumen;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.service.PapIntegumenService;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.PapIntegumenVO;
import com.jasamedika.medifirst2000.vo.PasienVO;
import com.jasamedika.medifirst2000.vo.StatusAdaTidakAdaVO;
import com.jasamedika.medifirst2000.vo.WarnaKulitVO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:com/jasamedika/**/applicationContext.xml")
public class PapIntegumenServiceImplTest {
	
	@Autowired
	private PapIntegumenService papIntegumenService;
	
	@Autowired
	private PasienDao pasienDao;
	@Autowired
	private PasienConverter pasienConverter;
	
	@Test
	@Transactional
	public void testAddIntegumen() {
		PapIntegumenVO papIntegumenVO = populateModel();
		Map<String,Object> result = papIntegumenService.addIntegumen(papIntegumenVO);
		assertNotNull(result);
		assertEquals("Normal",((PapIntegumen) result.get("papIntegumen")).getWarnaKulit().getName());
		assertEquals("Tidak ada",((PapIntegumen) result.get("papIntegumen")).getKelainan().getName());
		assertEquals("Tidak ada",((PapIntegumen) result.get("papIntegumen")).getResikoDekubitos().getName());
		assertEquals("Tidak ada",((PapIntegumen) result.get("papIntegumen")).getLuka().getName());
		assertEquals("Reynaldi Ramadhani Pratama",((PapIntegumen) result.get("papIntegumen")).getPasien().getNamaPasien());
		assertTrue(((PapIntegumen) result.get("papIntegumen")).getIsNormal());
	}

	@Test
	@Transactional
	public void testUpdateIntegumen() {
		PapIntegumenVO papIntegumenVO = populateModel();
		Map<String,Object> result = papIntegumenService.addIntegumen(papIntegumenVO);
		assertNotNull(result);
		
		PapIntegumenVO papIntegumenVOUpdate = populateModelUpdate();
		Map<String,Object> resultUpdate = papIntegumenService.addIntegumen(papIntegumenVOUpdate);
		assertNotNull(resultUpdate);
		assertEquals("Pucat",((PapIntegumen) resultUpdate.get("papIntegumen")).getWarnaKulit().getName());
		assertEquals("Ada",((PapIntegumen) resultUpdate.get("papIntegumen")).getKelainan().getName());
		assertEquals("Ada",((PapIntegumen) resultUpdate.get("papIntegumen")).getResikoDekubitos().getName());
		assertEquals("Ada",((PapIntegumen) resultUpdate.get("papIntegumen")).getLuka().getName());
		assertEquals("Reynaldi Ramadhani Pratama",((PapIntegumen) resultUpdate.get("papIntegumen")).getPasien().getNamaPasien());
		assertFalse(((PapIntegumen) resultUpdate.get("papIntegumen")).getIsNormal());
	}

	@Test
	@Transactional
	public void testFindByNoCmAndTglInput() {
		String noCm = "000000000000005";
		String tglInput = "2016-07-17 04:26:00";
		Map<String,Object> result = papIntegumenService.findByNoCmAndTglInput(noCm, DateUtil.toDate(tglInput));
		assertNotNull(result);
		Boolean dataFound=new Boolean((boolean) result.get("dataFound"));
		assertTrue(dataFound);
	}
	
	@Test
	@Transactional
	public void populateModelTest(){
		/*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*/
		PapIntegumenVO papIntegumenVO = populateModel();
		assertEquals("Normal",papIntegumenVO.getWarnaKulit().getName());
		assertEquals("Tidak ada",papIntegumenVO.getKelainan().getName());
		assertEquals("Tidak ada",papIntegumenVO.getResikoDekubitos().getName());
		assertEquals("Tidak ada",papIntegumenVO.getLuka().getName());
	}
	
	private PapIntegumenVO populateModel(){
		PapIntegumenVO papIntegumenVO = new PapIntegumenVO();
		Pasien pasien = pasienDao.findOne(544);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		WarnaKulitVO warnaKulitVO = new WarnaKulitVO();
		warnaKulitVO.setId(1);
		warnaKulitVO.setName("Normal");
		StatusAdaTidakAdaVO statusAdaTidakAdaVO = new StatusAdaTidakAdaVO();
		statusAdaTidakAdaVO.setId(1);
		statusAdaTidakAdaVO.setName("Tidak ada");
		
		papIntegumenVO.setTglInput(generateDate());
		papIntegumenVO.setPasien(pasienVO);
		papIntegumenVO.setWarnaKulit(warnaKulitVO);
		papIntegumenVO.setKelainan(statusAdaTidakAdaVO);
		papIntegumenVO.setResikoDekubitos(statusAdaTidakAdaVO);
		papIntegumenVO.setLuka(statusAdaTidakAdaVO);
		papIntegumenVO.setIsNormal(true);
		return papIntegumenVO;
	}
	
	private PapIntegumenVO populateModelUpdate(){
		PapIntegumenVO papIntegumenVO = new PapIntegumenVO();
		Pasien pasien = pasienDao.findOne(544);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		WarnaKulitVO warnaKulitVO = new WarnaKulitVO();
		warnaKulitVO.setId(2);
		warnaKulitVO.setName("Pucat");
		StatusAdaTidakAdaVO statusAdaTidakAdaVO = new StatusAdaTidakAdaVO();
		statusAdaTidakAdaVO.setId(2);
		statusAdaTidakAdaVO.setName("Ada");
		papIntegumenVO.setIsNormal(false);
		
		papIntegumenVO.setTglInput(generateDate());
		papIntegumenVO.setPasien(pasienVO);
		papIntegumenVO.setWarnaKulit(warnaKulitVO);
		papIntegumenVO.setKelainan(statusAdaTidakAdaVO);
		papIntegumenVO.setResikoDekubitos(statusAdaTidakAdaVO);
		papIntegumenVO.setLuka(statusAdaTidakAdaVO);
		return papIntegumenVO;
	}
	
	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;
	}
	
}
