package org.appfuse.persistence.hibernate;

import java.lang.reflect.Method;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.appfuse.model.Education;
import org.appfuse.model.Experience;
import org.appfuse.model.Membership;
import org.appfuse.model.Reference;
import org.appfuse.model.Resume;
import org.appfuse.persistence.DAOException;
import org.appfuse.persistence.ResumeDAO;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;


public class ResumeDAOHibernate extends HibernateDaoSupport implements ResumeDAO {
    private Log log = LogFactory.getLog(ResumeDAOHibernate.class);

    /**
     * Get resume by name, create new one if necessary.
     *
     * @param userId the current user's id
     * @return a list of the user's resumes
     * @throws DAOException
     */
    public List getResumesByUserId(Long userId) throws DAOException {
        return getHibernateTemplate().find("from Resume r where r.userId=? order by upper(r.name)",
                                           userId);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getResume(java.lang.Long)
     */
    public Resume getResume(Long id) throws DAOException {
        return (Resume) getHibernateTemplate().get(Resume.class, id);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#saveObject(java.lang.Object)
     */
    public Object saveObject(Object o) throws DAOException {
        getHibernateTemplate().saveOrUpdateCopy(o);
        return o;
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#removeObject(java.lang.Object)
     */
    public void removeObject(Object o) throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("loading object to delete....");
        }

        // use reflection to get the id and fetch the object
        Method meth = o.getClass().getMethod("getId", new Class[0]);
        Long id = (Long) meth.invoke(o, new Object[0]);
        o = getHibernateTemplate().get(o.getClass(), id);
        if (o != null) {
            getHibernateTemplate().delete(o);
        }
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#removeResume(java.lang.Object)
     */
    public void removeResume(Object o) throws DAOException {
        getHibernateTemplate().delete(o);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getEducation(java.lang.Long)
     */
    public Education getEducation(Long id) throws DAOException {
        return (Education) getHibernateTemplate().get(Education.class, id);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getSchools(java.lang.Long)
     */
    public List getSchools(Long resumeId) throws DAOException {
        return getHibernateTemplate().find("from Education e where e.resumeId=?",
                                           resumeId);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getExperience(java.lang.Long)
     */
    public Experience getExperience(Long id) throws DAOException {
        return (Experience) getHibernateTemplate().get(Experience.class, id);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getWorkHistory(java.lang.Long)
     */
    public List getWorkHistory(Long resumeId) throws DAOException {
        return getHibernateTemplate().find("from Experience e where e.resumeId=?",
                                           resumeId);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getReferences(java.lang.Long)
     */
    public List getReferences(Long resumeId) throws DAOException {
        return getHibernateTemplate().find("from Reference r where r.resumeId=?",
                                           resumeId);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getReference(java.lang.Long)
     *
     */
    public Reference getReference(Long id) throws DAOException {
        return (Reference) getHibernateTemplate().get(Reference.class, id);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getMemberships(java.lang.Long)
     */
    public List getMemberships(Long resumeId) throws DAOException {
        return getHibernateTemplate().find("from Membership m where m.resumeId=?",
                                           resumeId);
    }

    /**
     * @see org.appfuse.persistence.ResumeDAO#getMembership(java.lang.Long)
     */
    public Membership getMembership(Long id) throws DAOException {
        return (Membership) getHibernateTemplate().get(Membership.class, id);
    }
}