package eu.dnetlib.dlms.jdbc;

import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import eu.dnetlib.dlms.lowlevel.objects.Set;
import eu.dnetlib.dlms.lowlevel.objects.SetDAO;
import eu.dnetlib.dlms.lowlevel.objects.structures.IntBasicValue;
import eu.dnetlib.dlms.lowlevel.objects.structures.StringBasicValue;
import eu.dnetlib.dlms.lowlevel.types.ObjType;
import eu.dnetlib.dlms.lowlevel.types.ObjTypeDAO;
import eu.dnetlib.dlms.lowlevel.types.SetType;
import eu.dnetlib.dlms.lowlevel.types.SetTypeDAO;
import eu.dnetlib.dlms.lowlevel.types.structures.BasicDescriptionType;
import eu.dnetlib.dlms.lowlevel.types.structures.BasicType;
import eu.dnetlib.dlms.lowlevel.types.structures.LabelType;
import eu.dnetlib.dlms.lowlevel.types.structures.StructureType;
import eu.dnetlib.dlms.lowlevel.types.structures.StructureTypeDAO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TestClojureDQLParserExecution {

	@Resource
	private DataSource dataSource;

	@Resource
	private SetDAO setDAO;

	@Resource
	private SetTypeDAO setTypeDAO;

	@Resource
	private ObjTypeDAO objTypeDAO;

	@Resource
	private StructureTypeDAO structTypeDAO;

	@Before
	public void setUp() throws Exception {
		// save a set with name car, otherwise it will not work
		
		ObjType type = objTypeDAO.create();
		type.setName("CarType");
		objTypeDAO.save(type);

		SetType carSetType = setTypeDAO.create(type);
		carSetType.setName("car");
		setTypeDAO.save(carSetType);

		Set carSet = setDAO.create();
		carSet.setInfo("Set per macchine...ehe he eh");
		carSet.setObjectType(carSetType);
		setDAO.save(carSet);
		

		BasicDescriptionType def = new BasicDescriptionType();
		Map<String, LabelType> defMap = new HashMap<String, LabelType>();
		defMap.put("model", new BasicType(StringBasicValue.class));
		defMap.put("year", new BasicType(IntBasicValue.class));
		def.setDescriptionDefinitionMap(defMap);

		StructureType carDescType = structTypeDAO.create(def);
		carDescType.setName("CarDescType");
		structTypeDAO.save(carDescType);
		
		SetType carDescSetType = setTypeDAO.create(carDescType);
		carDescSetType.setName("carDesc");
		setTypeDAO.save(carDescSetType);

		Set carDescSet = setDAO.create();
		carDescSet.setInfo("Set per descrizioni macchine");
		carDescSet.setObjectType(carDescSetType);
		setDAO.save(carDescSet);

	}

	@Test
	public void testStatement() throws SQLException {
		Statement st = dataSource.getConnection().createStatement();
		st.execute("new car(); new carDesc([model=\"Toyota\", year=2001])");
	}

}
