package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.*;
import eu.dnetlib.goldoa.service.dao.OrganizationDAO;
import eu.dnetlib.goldoa.service.dao.PersonDAO;
import eu.dnetlib.goldoa.service.dao.ProjectDAO;
import eu.dnetlib.goldoa.service.dao.RequestDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by antleb on 3/3/15.
 */
@Transactional
public class ProjectManagerImpl implements ProjectManager {

    @Autowired
	private ProjectDAO projectDAO;
    @Autowired
	private PersonDAO personDAO;
    @Autowired
	private OrganizationDAO organizationDAO;
    @Autowired
    private RequestDAO requestDAO;

    private int maxRequests;

	@Override
	public List<Vocabulary> search(String term) {
		return projectDAO.search(term);
	}

	@Override
	public ProjectInfo getById(String projectId) {

		Project project = projectDAO.getProject(projectId);

		loadRelationships(project);

		return getProjectInfo(project);
	}

    private ProjectInfo getProjectInfo(Project project) {
        ProjectInfo projectInfo = new ProjectInfo();
        List<Request> requests = requestDAO.getForProject(project.getId());
        int approved = 0;

        for (Request request:requests)
            if (request.getStatus(Request.RequestStatus.APPROVED))
                approved++;

        projectInfo.setProject(project);
        projectInfo.setRemainingPublications(maxRequests - approved);

        return projectInfo;
    }

    @Override
    public List<Project> getEligibleProjectsForOrganization(String organizationId) {
        List<Project> projects = projectDAO.getEligibleProjectsForOrganization(organizationId);

        return projects;
    }

    @Override
    public List<Project> getFutureEligibleProjectsForOrganization(String organizationId) {
        List<Project> projects = projectDAO.getFutureEligibleProjectsForOrganization(organizationId);

        return projects;
    }

    private void loadRelationships(Project project) {

        List<Person> coordinators = new ArrayList<Person>();

        for (Person p:project.getCoordinators()) {
            try {
                coordinators.add(personDAO.getPersonById(p.getId()));
            } catch (EmptyResultDataAccessException e) {
                ;
            }
        }
        project.setCoordinators(coordinators);

		List<Organization> orgs = new ArrayList<Organization>();

		for (Organization org:project.getOrganizations()) {
			orgs.add(organizationDAO.getOrganization(org.getId()));
		}
		project.setOrganizations(orgs);
	}

    public int getMaxRequests() {
        return maxRequests;
    }

    public void setMaxRequests(int maxRequests) {
        this.maxRequests = maxRequests;
    }
}
