/*******************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *******************************************************************************/

package org.apache.ofbiz.accounting.thirdparty.sagepay;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.ofbiz.base.util.Debug;


public final class SagePayUtil {

    public static final String module = SagePayUtil.class.getName();
    private SagePayUtil() {}

    public static Map<String, Object> buildCardAuthorisationPaymentResponse
    (Boolean authResult, String authCode, String authFlag, BigDecimal processAmount, String authRefNum, String authAltRefNum, String authMessage) {

        Map<String, Object> result = new HashMap<String, Object>();
        if(authResult != null) { result.put("authResult", authResult); }
        if(authCode != null) { result.put("authCode", authCode); }
        if(authFlag != null) { result.put("authFlag", authFlag); }
        if(processAmount != null) { result.put("processAmount", processAmount); }
        if(authRefNum != null) { result.put("authRefNum", authRefNum); }
        if(authAltRefNum != null) { result.put("authAltRefNum", authAltRefNum); }
        if(authMessage != null) { result.put("authMessage", authMessage); }
        return result;
    }

    public static Map<String, Object> buildCardCapturePaymentResponse
    (Boolean captureResult, String captureCode, String captureFlag, BigDecimal captureAmount, String captureRefNum, String captureAltRefNum, String captureMessage) {

        Map<String, Object> result = new HashMap<String, Object>();
        if(captureResult != null) { result.put("captureResult", captureResult); }
        if(captureCode != null) { result.put("captureCode", captureCode); }
        if(captureFlag != null) { result.put("captureFlag", captureFlag); }
        if(captureAmount != null) { result.put("captureAmount", captureAmount); }
        if(captureRefNum != null) { result.put("captureRefNum", captureRefNum); }
        if(captureAltRefNum != null) { result.put("captureAltRefNum", captureAltRefNum); }
        if(captureMessage != null) { result.put("captureMessage", captureMessage); }
        return result;
    }

    public static Map<String, Object> buildCardReleasePaymentResponse
    (Boolean releaseResult, String releaseCode, BigDecimal releaseAmount, String releaseRefNum, String releaseAltRefNum, String releaseMessage) {

        Map<String, Object> result = new HashMap<String, Object>();
        if(releaseResult != null) { result.put("releaseResult", releaseResult); }
        if(releaseCode != null) { result.put("releaseCode", releaseCode); }
        if(releaseAmount != null) { result.put("releaseAmount", releaseAmount); }
        if(releaseRefNum != null) { result.put("releaseRefNum", releaseRefNum); }
        if(releaseAltRefNum != null) { result.put("releaseAltRefNum", releaseAltRefNum); }
        if(releaseMessage != null) { result.put("releaseMessage", releaseMessage); }
        return result;
    }

    public static Map<String, Object> buildCardVoidPaymentResponse
    (Boolean refundResult, BigDecimal refundAmount, String refundRefNum, String refundAltRefNum, String refundMessage) {

        Map<String, Object> result = new HashMap<String, Object>();
        if(refundResult != null) { result.put("refundResult", refundResult); }
        if(refundAmount != null) { result.put("refundAmount", refundAmount); }
        if(refundRefNum != null) { result.put("refundRefNum", refundRefNum); }
        if(refundAltRefNum != null) { result.put("refundAltRefNum", refundAltRefNum); }
        if(refundMessage != null) { result.put("refundMessage", refundMessage); }
        return result;
    }

    public static Map<String, Object> buildCardRefundPaymentResponse
    (Boolean refundResult, String refundCode, BigDecimal refundAmount, String refundRefNum, String refundAltRefNum, String refundMessage) {

        Map<String, Object> result = new HashMap<String, Object>();
        if(refundResult != null) { result.put("refundResult", refundResult); }
        if(refundCode != null) { result.put("refundCode", refundCode); }
        if(refundAmount != null) { result.put("refundAmount", refundAmount); }
        if(refundRefNum != null) { result.put("refundRefNum", refundRefNum); }
        if(refundAltRefNum != null) { result.put("refundAltRefNum", refundAltRefNum); }
        if(refundMessage != null) { result.put("refundMessage", refundMessage); }
        return result;
    }

    public static HttpHost getHost(Map<String, String> props) {
        String hostUrl = null;
        if("PRODUCTION".equals(props.get("sagePayMode"))) {
            hostUrl = props.get("productionHost");
        } else if("TEST".equals(props.get("sagePayMode"))) {
            hostUrl = props.get("testingHost");
        }
        String scheme = hostUrl.substring(0, 5);
        String host = hostUrl.substring(8, hostUrl.lastIndexOf(":"));
        String port = hostUrl.substring(hostUrl.lastIndexOf(":")+1);
        return getHost(host, Integer.parseInt(port), scheme);
    }

    public static HttpHost getHost(String hostName, int port, String scheme) {
        HttpHost host = new HttpHost(hostName, port, scheme);
        return host;
    }

    public static Map<String, String> getResponseData(HttpResponse response) throws IOException {

        Map<String, String> responseData = new HashMap<String, String>();
        HttpEntity httpEntity = response.getEntity();
        if (httpEntity != null) {
            InputStream inputStream = httpEntity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            String data = null;
            while( (data = reader.readLine()) != null ) {
                if(data.indexOf("=") != -1) {
                    String name = data.substring(0, data.indexOf("="));
                    String value = data.substring(data.indexOf("=")+1);
                    responseData.put(name, value);
                }
            }
        }
        Debug.logInfo("SagePay Response Data : " + responseData, module);
        return responseData;
    }

    public static HttpPost getHttpPost(String uri, Map<String, String> parameters) throws UnsupportedEncodingException {

        HttpPost httpPost = new HttpPost(uri);
        httpPost.addHeader("User-Agent", "HTTP Client");
        httpPost.addHeader("Content-type", "application/x-www-form-urlencoded");
        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
        Set<String> keys = parameters.keySet();
        for (String key : keys) {
            String value = parameters.get(key);
            postParameters.add(new BasicNameValuePair(key, value));
        }

        Debug.logInfo("SagePay PostParameters - " + postParameters, module);

        HttpEntity postEntity = new UrlEncodedFormEntity(postParameters);
        httpPost.setEntity(postEntity);
        return httpPost;
    }

    public static CloseableHttpClient getHttpClient() {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        return httpClient;
    }
}
