package eu.dnetlib.server;

import com.google.gwt.user.client.Window;
import eu.dnetlib.goldoa.domain.*;
import eu.dnetlib.goldoa.service.BudgetManager;
import eu.dnetlib.goldoa.service.InvoiceManager;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * Created by stefania on 4/3/15.
 */
public class BudgetServlet extends HttpServlet {

//    private InvoiceManager invoiceManager;
    private BudgetManager budgetManager;

    @Override
    public void init(ServletConfig config) throws ServletException {

        super.init(config);

        ApplicationContext context = WebApplicationContextUtils
                .getWebApplicationContext(getServletContext());

        this.budgetManager = (BudgetManager) context.getBean("budgetManager");
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
        try {
            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            List<FileItem> items = upload.parseRequest(request);

            Budget budget = new Budget();
            BankAccount bankAccount = null;

            //budget.setCurrency(Currency.EUR);

            budget = budgetManager.saveBudget(budget);

            for (FileItem item:items) {
                if (item.isFormField()) {
                    String fieldName = item.getFieldName();
                    String value = item.getString();

                    if (fieldName.equals("institution")) {
                        //TODO fix!
                        //budget.setOrganization(value);
                    } else if (fieldName.equals("amountRequested")) {
                       // budget.setAmountRequested(Float.parseFloat(value));
                    } else if (fieldName.equals("userId")) {
                        //budget.setUser(value);
                    } else if (fieldName.equals("startDate")) {
                        budget.setStartdate(new SimpleDateFormat("yyyy/MM/dd").parse(value));
                    } else if (fieldName.equals("endDate")) {
                        budget.setEnddate(new SimpleDateFormat("yyyy/MM/dd").parse(value));
                    } else if (fieldName.equals("bankName")) {
                        if(bankAccount==null)
                            bankAccount = new BankAccount();
                        bankAccount.setBankName(value);
                    } else if (fieldName.equals("bankAddress")) {
                        if(bankAccount==null)
                            bankAccount = new BankAccount();
                        bankAccount.setBankAddress(value);
                    } else if (fieldName.equals("accountHolder")) {
                        if(bankAccount==null)
                            bankAccount = new BankAccount();
                        bankAccount.setAccountHolder(value);
                    } else if (fieldName.equals("accountNumber")) {
                        if(bankAccount==null)
                            bankAccount = new BankAccount();
                        bankAccount.setIban(value);
                    } else if (fieldName.equals("bankCode")) {
                        if(bankAccount==null)
                            bankAccount = new BankAccount();
                        bankAccount.setBankCode(value);
                    }

                } else {
                    String contentType = item.getContentType();


//                    budgetManager.uploadTerms(budget.getId(), contentType, item.getInputStream());
                }
            }

            //budget.setBankAccount(bankAccount);

            budget.setStatus(Budget.Status.SUBMITTED);
            budgetManager.saveBudget(budget);

            response.setContentType("text/plain");
            response.setContentLength(budget.getId().length());

            response.getOutputStream().print(budget.getId());
        }
        catch(Exception e){
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String budgetId = req.getParameter("budgetId");

        try {
//            BudgetFile file = budgetManager.downloadBudgetTerms(budgetId);
//
//            resp.setContentType(file.getContentType());
//            resp.setContentLength(file.getContent().length);
//
//            IOUtils.copy(new ByteArrayInputStream(file.getContent()), resp.getOutputStream());
        } catch (Exception e) {
            resp.setStatus(500);
            resp.getOutputStream().println("Error getting signed terms of agreement of budget with id " + budgetId);
        }
    }
}