package org.appfuse.service;

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.Resume;
import org.appfuse.persistence.ResumeDAO;
import org.appfuse.persistence.SkillDAO;


/**
 * Business Delegate (Proxy) Interface to handle communication between web and
 * persistence layer
 *
 * <p>
 * <a href="ResumeManagerImpl.java.html"><i>View Source</i></a>
 * </p>
 *
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 * @version $Revision: 1.1 $ $Date: 2004/03/31 13:04:17 $
 */
public class ResumeManagerImpl extends BaseManager implements ResumeManager {
    private Log log = LogFactory.getLog(ResumeManagerImpl.class);
    private ResumeDAO dao;
    private SkillDAO skillDao;

    public void setResumeDAO(ResumeDAO dao) {
        this.dao = dao;
    }

    public void setSkillDAO(SkillDAO dao) {
        this.skillDao = dao;
    }

    /**
     * @see org.appfuse.service.ResumeManager#getResumesForUser(java.lang.String)
     */
    public List getResumesForUser(String userId) throws Exception {
        return dao.getResumesByUserId(Long.valueOf(userId));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getResume(java.lang.String)
     */
    public Object getResume(String resumeId) throws Exception {
        return dao.getResume(Long.valueOf(resumeId));
    }

    /**
     *
     * @see org.appfuse.service.ResumeManager#saveResume(java.lang.Object)
     */
    public Object saveResume(Object obj) throws Exception {
        Resume resume = (Resume) obj;
        dao.saveObject(resume);

        return getResume(resume.getId().toString());
    }

    /**
     * @see org.appfuse.service.ResumeManager#removeObject(java.lang.Object)
     */
    public void removeObject(Object o) throws Exception {
        dao.removeObject(o);
    }

    /**
     * @see org.appfuse.service.ResumeManager#removeObject(java.lang.Object)
     */
    public Object saveObject(Object o) throws Exception {      
        dao.saveObject(o); 
        return getObject(o);
    }

    /**
     * Convenience method to use reflection and fetch an object based on its id.
     * @param pojo The POJO you'd like to lookup
     * @return a populated pojo - null if it doesn't exist
     * @throws Exception
     */
    public Object getObject(Object pojo) throws Exception {
        // use reflection to get the id and fetch the object
        Method meth = pojo.getClass().getMethod("getId", new Class[0]);
        Long id = (Long) meth.invoke(pojo, new Object[0]);

        if (log.isDebugEnabled()) {
            log.debug("id set to: " + id);
        }

        // get the object name
        String name = pojo.getClass().getName();
        name = name.substring(name.lastIndexOf('.') + 1, name.length());

        if (log.isDebugEnabled()) {
            log.debug("name: " + name);
        }

        meth =
            this.getClass().getMethod("get" + name, new Class[] { String.class });

        return meth.invoke(this, new Object[] { String.valueOf(id) });
    }

    /**
     * @see org.appfuse.service.ResumeManager#getEducation(java.lang.String)
     */
    public Object getEducation(String id) throws Exception {
        if (id == null) {
            throw new IllegalArgumentException("id is a required parameter!");
        }

        return dao.getEducation(Long.valueOf(id));
        //return convertDates(pojo, form);
    }

    /**
     * @see org.appfuse.service.ResumeManager#getResumeSkill(java.lang.String)
     */
    public Object getResumeSkill(String id) throws Exception {
        if (id == null) {
            throw new IllegalArgumentException("id is a required parameter!");
        }

        return skillDao.getResumeSkill(Long.valueOf(id));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getResumeSkills(java.lang.String)
     */
    public List getResumeSkills(String resumeId) throws Exception {
        if (resumeId == null) {
            throw new IllegalArgumentException("resumeId is a required parameter!");
        }

        return skillDao.getResumeSkills(Long.valueOf(resumeId));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getExperience(java.lang.String)
     */
    public Object getExperience(String id) throws Exception {
        if (id == null) {
            throw new IllegalArgumentException("id is a required parameter!");
        }

        return dao.getExperience(Long.valueOf(id));
        //Object form = convert(pojo);
        //return convertDates(pojo, form);
    }

    /**
     * @see org.appfuse.service.ResumeManager#getMembership(java.lang.String)
     */
    public Object getMembership(String id) throws Exception {
        if (id == null) {
            throw new IllegalArgumentException("id is a required parameter!");
        }

        return dao.getMembership(Long.valueOf(id));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getMemberships(java.lang.String)
     */
    public List getMemberships(String resumeId) throws Exception {
        if (resumeId == null) {
            throw new IllegalArgumentException("resumeId is a required parameter!");
        }

        return dao.getMemberships(Long.valueOf(resumeId));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getReference(java.lang.String)
     */
    public Object getReference(String id) throws Exception {
        if (id == null) {
            throw new IllegalArgumentException("id is a required parameter!");
        }

        return dao.getReference(Long.valueOf(id));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getReferences(java.lang.String)
     */
    public List getReferences(String resumeId) throws Exception {
        if (resumeId == null) {
            throw new IllegalArgumentException("resumeId is a required parameter!");
        }

        return dao.getReferences(Long.valueOf(resumeId));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getSchools(java.lang.String)
     */
    public List getSchools(String resumeId) throws Exception {
        if (resumeId == null) {
            throw new IllegalArgumentException("resumeId is a required parameter!");
        }

        return dao.getSchools(Long.valueOf(resumeId));
    }

    /**
     * @see org.appfuse.service.ResumeManager#getWorkHistory(java.lang.String)
     */
    public List getWorkHistory(String resumeId) throws Exception {
        if (resumeId == null) {
            throw new IllegalArgumentException("resumeId is a required parameter!");
        }

        return dao.getWorkHistory(Long.valueOf(resumeId));
    }
}