package org.ruler.sample;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.ruler.Client;
import org.ruler.Mode;
import org.ruler.Provider;
import org.ruler.Server;

public class Main {

	public static void main(String[] args) {
		try {
			new Main().test();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	void test() throws SQLException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, InstantiationException {


		// TODO Auto-generated method stub
		Server server = new Server(Mode.tcp); // HSQL localhost
		server.start();

		// Provider likes EntityManagerFactory.class of JPA or Hibernate etc...
		Provider provider = new Provider(Mode.tcp); // HSQL localhost
		provider.bind(User.class, () -> new User());
		provider.open();


		// Cliant likes EntityManager.class of JPA or Hibernate etc...
		try(Client client = provider.open()){ // AutoCloseable.close().

			// 前回のデータが残っていたらドロップする。
			client.table.drop(User.class);

			client.table.create(User.class);

			for(int i=0; i<100; i++){

				// CRUD(Create)
				User user = client.insert(User.class);

				// CRUD(Update)
				user.name.update("Java Entity Ruler");
				user.age.update(i);
				client.update(user);
			}


			Map<Integer, User> map = new HashMap<>();
			List<User> list = new ArrayList<>();

			// CRUD(Read)
			client.find(User.class, (e) -> {

				// Event e == JDBC ResultSet, that will be closed after lambda.

				int count = e.count(); // all size (SQL COUNT(*))
				int index = e.index();
				User user = e.value();

				// from 25% to 75%
				if(index > count/4 && index < count*3/4){
					// CRUD(Delete)
					client.remove(user);

					// return value with Map<int, Entity>.
					int age = user.age.value();
					map.put(age, user);

					// Entity value with List<Entity>.
					list.add(user);
				}
			});

			for(User user : list){
				long id = user.id.value();
				String msg = "User id("+id+") is deleted.";
				System.out.println(msg);
			}

			int age = 99;
			User user = map.get(age);
			if( user != null ){
				String msg = "User age("+age+") is deleted.";
				System.out.println(msg);
			}


			client.table.drop(User.class);

		}

		provider.close();

		server.stop();
		server.dispose();
	}
}