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.PapMuskuloskeletal;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.service.PapMuskuloskeletalService;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.GerakanAnakVO;
import com.jasamedika.medifirst2000.vo.PapMuskuloskeletalVO;
import com.jasamedika.medifirst2000.vo.PasienVO;
import com.jasamedika.medifirst2000.vo.StatusAdaTidakAdaVO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:com/jasamedika/**/applicationContext.xml")
public class PapMuskuloskeletalServiceImplTest {
	
	@Autowired
	private PapMuskuloskeletalService papMuskuloskeletalService;
	
	@Autowired
	private PasienDao pasienDao;
	
	@Autowired
	private PasienConverter pasienConverter;
	
	@Test
	@Transactional
	public void testAddMuskuloskeletal() {
		PapMuskuloskeletalVO papMuskuloskeletalVO = populateModel();
		Map<String,Object> result = papMuskuloskeletalService.addMuskuloskeletal(papMuskuloskeletalVO);
		assertNotNull(result);
		assertEquals("Reynaldi Ramadhani Pratama",((PapMuskuloskeletal) result.get("papMuskuloskeletal")).getPasien().getNamaPasien());
		assertEquals("Tidak ada",((PapMuskuloskeletal) result.get("papMuskuloskeletal")).getKelainanTulang().getName());
		assertEquals("Bebas",((PapMuskuloskeletal) result.get("papMuskuloskeletal")).getGerakanAnak().getName());
		assertNotNull(((PapMuskuloskeletal) result.get("papMuskuloskeletal")).getTglInput());
	}

	@Test
	@Transactional
	public void testUpdateMuskuloskeletal() {
		PapMuskuloskeletalVO papMuskuloskeletalVO = populateModel();
		Map<String,Object> result = papMuskuloskeletalService.addMuskuloskeletal(papMuskuloskeletalVO);
		assertNotNull(result);
		
		PapMuskuloskeletalVO papMuskuloskeletalVOUpdate = populateModelUpdate();
		Map<String,Object> resultUpdate = papMuskuloskeletalService.addMuskuloskeletal(papMuskuloskeletalVOUpdate);
		assertEquals("Reynaldi Ramadhani Pratama",((PapMuskuloskeletal) resultUpdate.get("papMuskuloskeletal")).getPasien().getNamaPasien());
		assertEquals("Ada",((PapMuskuloskeletal) resultUpdate.get("papMuskuloskeletal")).getKelainanTulang().getName());
		assertEquals("Terbatas",((PapMuskuloskeletal) resultUpdate.get("papMuskuloskeletal")).getGerakanAnak().getName());
		assertNotNull(((PapMuskuloskeletal) resultUpdate.get("papMuskuloskeletal")).getTglInput());
	}

	@Test
	@Transactional
	public void testFindByNoCmAndTglInput() {
		String noCm = "000001";
		String tglInput = "2013-06-07 12:10:56";
		Map<String,Object> result = papMuskuloskeletalService.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 Atribut VO*/
		StatusAdaTidakAdaVO statusAdaTidakAdaVO = new StatusAdaTidakAdaVO();
		statusAdaTidakAdaVO.setId(1);
		statusAdaTidakAdaVO.setName("Tidak Ada");
		assertNotNull(statusAdaTidakAdaVO);
		assertEquals(String.valueOf(1), String.valueOf(statusAdaTidakAdaVO.getId()));
		assertEquals("Tidak Ada",statusAdaTidakAdaVO.getName());
		GerakanAnakVO gerakanAnakVO = new GerakanAnakVO();
		gerakanAnakVO.setId(1);
		gerakanAnakVO.setName("Bebas");
		assertEquals(String.valueOf(1), String.valueOf(gerakanAnakVO.getId()));
		assertNotNull(gerakanAnakVO);
		
	}
	
	public PapMuskuloskeletalVO populateModel(){
		PapMuskuloskeletalVO papMuskuloskeletalVO = new PapMuskuloskeletalVO();
		Pasien pasien = pasienDao.findOne(544);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		StatusAdaTidakAdaVO statusAdaTidakAdaVO = new StatusAdaTidakAdaVO();
		statusAdaTidakAdaVO.setId(1);
		statusAdaTidakAdaVO.setName("Tidak ada");
		GerakanAnakVO gerakanAnakVO = new GerakanAnakVO();
		gerakanAnakVO.setId(1);
		gerakanAnakVO.setName("Bebas");
		
		papMuskuloskeletalVO.setIsNormal(true);
		papMuskuloskeletalVO.setKelainanTulang(statusAdaTidakAdaVO);
		papMuskuloskeletalVO.setPasien(pasienVO);
		papMuskuloskeletalVO.setTglInput(generateDate());
		papMuskuloskeletalVO.setGerakanAnak(gerakanAnakVO);
		return papMuskuloskeletalVO;
	}
	
	public PapMuskuloskeletalVO populateModelUpdate(){
		PapMuskuloskeletalVO papMuskuloskeletalVO = new PapMuskuloskeletalVO();
		Pasien pasien = pasienDao.findOne(544);
		PasienVO pasienVO = pasienConverter.transferModelToVO(pasien,new PasienVO());
		StatusAdaTidakAdaVO statusAdaTidakAdaVO = new StatusAdaTidakAdaVO();
		statusAdaTidakAdaVO.setId(2);
		statusAdaTidakAdaVO.setName("Ada");
		GerakanAnakVO gerakanAnakVO = new GerakanAnakVO();
		gerakanAnakVO.setId(2);
		gerakanAnakVO.setName("Terbatas");
		
		papMuskuloskeletalVO.setKelainanTulang(statusAdaTidakAdaVO);
		papMuskuloskeletalVO.setPasien(pasienVO);
		papMuskuloskeletalVO.setTglInput(new Date());
		papMuskuloskeletalVO.setGerakanAnak(gerakanAnakVO);
		return papMuskuloskeletalVO;
	}
	
	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;
	}
	
}
