package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.Budget;
import eu.dnetlib.goldoa.domain.Organization;
import eu.dnetlib.goldoa.domain.OrganizationManagerException;
import eu.dnetlib.goldoa.domain.Vocabulary;
import eu.dnetlib.goldoa.service.dao.BudgetDAO;
import eu.dnetlib.goldoa.service.dao.OrganizationDAO;
import org.apache.commons.codec.digest.DigestUtils;
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 OrganizationManagerImpl implements OrganizationManager {

	@Autowired
	private OrganizationDAO organizationDAO;

	@Autowired
	BudgetDAO budgetDAO;

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

	@Override
	public Organization getById(String organizationId) throws OrganizationManagerException {
		try {
			Organization organization = organizationDAO.getOrganization(organizationId);
			List<Budget> budgets = new ArrayList<Budget>();

			for (Budget b : organization.getBudgets())
				budgets.add(budgetDAO.getBudget(b.getId()));

			organization.setBudgets(budgets);

			return organization;
		} catch (EmptyResultDataAccessException e) {
			throw new OrganizationManagerException(OrganizationManagerException.ErrorCause.NOT_EXISTS);
		}
	}

	@Override
	public List<Organization> getAffiliatedWithUser(String userId) {
		List<Organization> orgs = organizationDAO.getAffiliatedWithUser(userId);

		for (Organization org : orgs) {
			List<Budget> budgets = new ArrayList<Budget>();

			for (Budget b : org.getBudgets())
				budgets.add(budgetDAO.getBudget(b.getId()));

			org.setBudgets(budgets);
		}

		return orgs;
	}

	@Override
	public String saveOrganization(final Organization organization) throws OrganizationManagerException {

		if (organization.getId() == null) {
			organization.setId("portal::" + DigestUtils.md5Hex(organization.getName()));
			organization.setSource("portal");
		}

		organizationDAO.saveOrganization(organization);
		organizationDAO.deleteOrganizationBudgets(organization);
		organizationDAO.insertOrganizationBudgets(organization);

		return organization.getId();
	}
}
