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.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.transaction.annotation.Transactional;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * 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();
	}
}
