package com.albertattard.m2m.server;

import java.util.ArrayList;
import java.util.List;

import javax.jdo.JDOHelper;
import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;

import com.albertattard.m2m.client.DAOService;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class DAOServiceImpl extends RemoteServiceServlet implements DAOService {

	private static final PersistenceManagerFactory PMF_INSTANCE = JDOHelper
			.getPersistenceManagerFactory("transactions-optional");

	public String save(String itemName, String categryName) {
		PersistenceManager pm = PMF_INSTANCE.getPersistenceManager();
		try {
			KeyFactory.Builder keyBuilder = new KeyFactory.Builder(Item.class
					.getSimpleName(), itemName);
			keyBuilder.addChild(Category.class.getSimpleName(), categryName);
			Key categoryKey = keyBuilder.getKey();

			Category category = null;
			try {
				category = pm.getObjectById(Category.class, categoryKey);
			} catch (JDOObjectNotFoundException e) {
				category = new Category();
				category.setKey(categoryKey);
			}
			category.setName(categryName);
			pm.makePersistent(category);
			System.out.println("Category Key: " + categoryKey);

			Key itemKey = KeyFactory.createKey(Item.class.getSimpleName(),
					itemName);
			Item item = null;
			try {
				item = pm.getObjectById(Item.class, itemKey);
			} catch (JDOObjectNotFoundException e) {
				item = new Item();
				item.setKey(itemKey);
			}
			item.setName(itemName);
			item.addCategory(categoryKey);
			pm.makePersistent(item);
		} catch (Exception e) {
			e.printStackTrace();
			return "Failed";
		} finally {
			pm.close();
		}

		return "Done";
	}

	@SuppressWarnings("unchecked")
	public List<String> list() {
		PersistenceManager pm = PMF_INSTANCE.getPersistenceManager();
		List<String> list = new ArrayList<String>();
		try {
			Query query = pm.newQuery(Item.class);
			List<Item> results = (List<Item>) query.execute();
			for (Item i : results) {
				list.add(String.valueOf(i));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pm.close();
		}

		return list;
	}
}
