package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.Organization;
import eu.dnetlib.goldoa.domain.Person;
import eu.dnetlib.goldoa.domain.Project;
import eu.dnetlib.goldoa.domain.ProjectInfo;
import eu.dnetlib.goldoa.domain.Request;
import eu.dnetlib.goldoa.domain.Vocabulary;
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)
			switch (Request.RequestStatus.forStatus(request.getStatus())) {
				case CONDITIONALLY_APPROVED:
				case APPROVED:
				case ACCOUNTING_PROCESSING:
				case ACCOUNTING_ON_HOLD:
				case ACCOUNTING_PAID:
					approved++;
					break;
			}

		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;
	}
}
