package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.Invoice;
import eu.dnetlib.goldoa.domain.InvoiceFile;
import eu.dnetlib.goldoa.domain.ManagerException;
import eu.dnetlib.goldoa.service.dao.InvoiceDAO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.InputStream;
import java.util.UUID;

/**
 * Created by antleb on 3/21/15.
 */

@Transactional
@Service("invoiceManager")
public class InvoiceManagerImpl implements InvoiceManager {
	@Autowired
	private InvoiceDAO invoiceDAO;

	private Log logger = LogFactory.getLog(InvoiceManagerImpl.class);
	@Override

	public Invoice saveInvoice(Invoice invoice) {
		if (invoice.getId() == null) {
			invoice.setSource("portal");
			invoice.setId("portal::" + UUID.randomUUID().toString());
		}
        return invoiceDAO.saveInvoice(invoice);
	}

	@Override
	public Invoice getInvoice(String invoiceId) throws ManagerException {
        Invoice invoice  = invoiceDAO.getByKey(invoiceId);
	    if(invoice == null)
            throw new ManagerException(ManagerException.ErrorCause.NOT_EXISTS);
	    else
	        return invoice;
	}

	@Override
	public Invoice uploadInvoice(final String invoiceId, final String mimetype, InputStream invoice) throws ManagerException {
		try {
		    return invoiceDAO.uploadInvoice(invoiceId,mimetype,invoice);
		} catch (Exception e) {
			logger.debug("uploadInvoice",e);
			throw new ManagerException(ManagerException.ErrorCause.UNKNOWN);
		}
	}

	@Override
	public InvoiceFile downloadInvoice(String invoiceId) throws ManagerException {

	    Invoice inv = invoiceDAO.getByKey(invoiceId);
	    if(inv == null)
            throw new ManagerException(ManagerException.ErrorCause.NOT_EXISTS);
	    if(inv.getFile() == null)
            throw new ManagerException(ManagerException.ErrorCause.UNKNOWN);
	    return new InvoiceFile(inv,inv.getFile().getMimetype(),inv.getFile().getFile());
	}

	@Override
	public String getFileId() {
		return invoiceDAO.getFileId();
	}

}
