package org.eclipse.osbp.dsl.tests.dto.bindings;

import static org.junit.Assert.assertEquals;

import java.util.Date;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.IBeanListProperty;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.osbp.dsl.dto.lib.impl.DtoServiceAccess;
import org.eclipse.osbp.dsl.dto.lib.services.IDTOService;
import org.eclipse.osbp.dsl.tests.model.AbstractJPATest;
import org.junit.Test;
import org.osbp.mysmartshop.dtos.CashPositionDto;
import org.osbp.mysmartshop.dtos.CashRegisterDto;
import org.osbp.mysmartshop.dtos.CashSlipDto;
import org.osbp.mysmartshop.dtos.McustomerDto;

public class DtoBindingTests extends AbstractJPATest {

	private IDTOService<McustomerDto> customerService;
	private IDTOService<CashRegisterDto> cashRegisterService;
	private IDTOService<CashSlipDto> cashSlipService;
	private IDTOService<CashPositionDto> cashSlipPosService;

	int custId = 10;
	private CashSlipDto slip;

	@SuppressWarnings("restriction")
	@Override
	public void setUp() throws Exception {
		super.setUp();

		customerService = DtoServiceAccess.getService(McustomerDto.class);
		cashRegisterService = DtoServiceAccess
				.getService(CashRegisterDto.class);
		cashSlipService = DtoServiceAccess.getService(CashSlipDto.class);
		cashSlipPosService = DtoServiceAccess.getService(CashPositionDto.class);

		// create customer
		McustomerDto cust1 = new McustomerDto();
		cust1.setId(custId);
		cust1.setFullname("customer1");
		customerService.update(cust1);
		cust1 = customerService.get(custId);

		slip = new CashSlipDto();
		slip.setCashier("Jörg");
		slip.setCustomer(cust1);
		slip.setNow(new Date());
		slip.setCurrentDay(new Date().toString());
		slip.setSerial(10l);
		slip.setTotal(100d);

		CashPositionDto pos1 = new CashPositionDto();
		pos1.setPrice(1000d);
		pos1.setQuantity(10d);
		slip.addToPositions(pos1);

		CashPositionDto pos2 = new CashPositionDto();
		pos2.setPrice(1000d);
		pos2.setQuantity(10d);
		slip.addToPositions(pos2);
		
		CashPositionDto pos3 = new CashPositionDto();
		pos3.setPrice(1000d);
		pos3.setQuantity(10d);
		slip.addToPositions(pos3);
		
		CashPositionDto pos4 = new CashPositionDto();
		pos4.setPrice(1000d);
		pos4.setQuantity(10d);
		slip.addToPositions(pos4);

		cashSlipService.update(slip);
		
		// reload the slip
		slip = cashSlipService.get(slip.getId());
	}

	@Test
	public void testListBinding() throws Exception {
		setUp();
		
		new CustomRealm();

		IBeanListProperty sourceProperty = BeanProperties.list(CashSlipDto.class, "positions", CashPositionDto.class);
		IObservableList sourceList = sourceProperty.observe(slip);
		
		WritableList targetList = new WritableList();
		
		DataBindingContext dbc = new DataBindingContext();
		dbc.bindList(targetList, sourceList);		
		dbc.updateTargets();
		
		assertEquals(4, targetList.size());

		CashPositionDto pos1 = (CashPositionDto) sourceList.get(0);
		CashPositionDto pos2 = (CashPositionDto) sourceList.get(2);
		
		slip.removeFromPositions(pos1);
		assertEquals(3, targetList.size());
		
		slip.removeFromPositions(pos2);
		assertEquals(2, targetList.size());
		
		slip.addToPositions(pos1);
		assertEquals(3, targetList.size());
		
		slip.addToPositions(pos2);
		assertEquals(4, targetList.size());
		
		slip.addToPositions(pos2);
		slip.addToPositions(pos2);
		slip.addToPositions(pos2);
		assertEquals(4, targetList.size());
	}
	
	
	public static class CustomRealm extends Realm {

		public CustomRealm() {
			setDefault(this);
		}
		
		@Override
		public boolean isCurrent() {
			return true;
		}
		
	}
}
