package com.giffing.wicket.spring.boot.example.web.pages.customers;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

import javax.transaction.Transactional;

import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.markup.repeater.Item;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;

import com.giffing.wicket.spring.boot.example.model.Customer;
import com.giffing.wicket.spring.boot.example.repository.services.customer.CustomerRepositoryService;
import com.giffing.wicket.spring.boot.example.repository.services.customer.filter.CustomerFilter;
import com.giffing.wicket.spring.boot.example.repository.services.customer.filter.CustomerSort;
import com.giffing.wicket.spring.boot.example.web.WicketBaseIntTest;
import com.giffing.wicket.spring.boot.example.web.html.modal.YesNoModal;

@Transactional
@Rollback
public class CustomerListIntTest extends WicketBaseIntTest {
	
	@Autowired
	private CustomerRepositoryService service;
	
	@Test
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void assert_start_customer_list_page(){
		getTester().startPage(CustomerListPage.class);
		getTester().assertRenderedPage(CustomerListPage.class);
		getTester().assertComponent("filterForm:table", DataTable.class);
		
		DataTable<Customer, CustomerSort> dataTable = (DataTable) getTester().getComponentFromLastRenderedPage("filterForm:table");
		assertThat(dataTable.getItemCount(), equalTo(5L));
		//id, username, firstname, lastname, active, actions
		assertThat(dataTable.getColumns().size(), equalTo(6));
		//get third row
		Item<Customer> item3 = (Item) getTester().getComponentFromLastRenderedPage("filterForm:table:body:rows:3");
		assertThat(item3.getModelObject().getId(), equalTo(3L));
		assertThat(item3.getModelObject().getUsername(), equalTo("adalgrim"));
		
		Item<Customer> item5 = (Item) getTester().getComponentFromLastRenderedPage("filterForm:table:body:rows:5");
		assertThat(item5.getModelObject().getId(), equalTo(5L));
		assertThat(item5.getModelObject().getUsername(), equalTo("tuk"));
	}
	
	@Test
	public void assert_delete_customer_method_called_once(){
		getTester().startPage(CustomerListPage.class);
		getTester().assertRenderedPage(CustomerListPage.class);
		
		DataTable<Customer, CustomerSort> dataTable = (DataTable) getTester().getComponentFromLastRenderedPage("filterForm:table");
		assertThat(dataTable.getItemCount(), equalTo(5L));
		
		getTester().clickLink(getTableCell(5, 6) + "items:1:item:link");
		getTester().assertComponent("defaultModal", YesNoModal.class);
		getTester().clickLink("defaultModal:content:yes", true);
		
		assertThat(dataTable.getItemCount(), equalTo(4L));
		
	}
	
	private String getTableCell(int row, int cell){
		return "filterForm:table:body:rows:" + row + ":cells:" + cell + ":cell:";
	}
}