/**
 * 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.fineract.integrationtests.common.recurringdeposit;

import com.google.gson.Gson;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.fineract.client.models.GetRecurringDepositProductsProductIdResponse;
import org.apache.fineract.client.util.JSON;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.accounting.Account;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SuppressWarnings({ "unused", "rawtypes" })
public class RecurringDepositProductHelper {

    private static final Logger LOG = LoggerFactory.getLogger(RecurringDepositProductHelper.class);
    private final RequestSpecification requestSpec;
    private final ResponseSpecification responseSpec;
    private static final Gson GSON = new JSON().getGson();

    public RecurringDepositProductHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
        this.requestSpec = requestSpec;
        this.responseSpec = responseSpec;
    }

    private static final String RECURRING_DEPOSIT_PRODUCT_URL = "/fineract-provider/api/v1/recurringdepositproducts";
    private static final String INTEREST_CHART_URL = "/fineract-provider/api/v1/interestratecharts";
    private static final String CREATE_RECURRING_DEPOSIT_PRODUCT_URL = RECURRING_DEPOSIT_PRODUCT_URL + "?" + Utils.TENANT_IDENTIFIER;

    private static final String LOCALE = "en_GB";
    private static final String DIGITS_AFTER_DECIMAL = "4";
    private static final String IN_MULTIPLES_OF = "100";
    private static final String USD = "USD";
    private static final String DAYS = "0";
    private static final String WEEKS = "1";
    private static final String MONTHS = "2";
    private static final String YEARS = "3";
    private static final String DAILY = "1";
    private static final String MONTHLY = "4";
    private static final String QUARTERLY = "5";
    private static final String ANNUALLY = "7";
    private static final String INTEREST_CALCULATION_USING_DAILY_BALANCE = "1";
    private static final String INTEREST_CALCULATION_USING_AVERAGE_DAILY_BALANCE = "2";
    private static final String DAYS_360 = "360";
    private static final String DAYS_365 = "365";
    private static final String NONE = "1";
    private static final String CASH_BASED = "2";
    private static final String ACCRUAL_PERIODIC = "3";
    private static final String ACCRUAL_UPFRONT = "4";
    private static final String WHOLE_TERM = "1";
    private static final String TILL_PREMATURE_WITHDRAWAL = "2";

    private final String name = Utils.uniqueRandomStringGenerator("RECURRING_DEPOSIT_PRODUCT_", 6);
    private final String shortName = Utils.uniqueRandomStringGenerator("", 4);
    private final String description = Utils.randomStringGenerator("", 20);
    private final String interestCompoundingPeriodType = MONTHLY;
    private final String interestPostingPeriodType = MONTHLY;
    private final String interestCalculationType = INTEREST_CALCULATION_USING_DAILY_BALANCE;
    private String accountingRule = NONE;
    private final String lockinPeriodFrequency = "1";
    private final String lockingPeriodFrequencyType = MONTHS;
    private final String minDepositTerm = "6";
    private final String minDepositTermTypeId = MONTHS;
    private final String maxDepositTerm = "10";
    private final String maxDepositTermTypeId = YEARS;
    private final String inMultiplesOfDepositTerm = "2";
    private final String inMultiplesOfDepositTermTypeId = MONTHS;
    private final String preClosurePenalInterest = "2";
    private final String preClosurePenalInterestOnTypeId = WHOLE_TERM;
    private final boolean preClosurePenalApplicable = true;
    private final String currencyCode = USD;
    private final String interestCalculationDaysInYearType = DAYS_365;
    private final boolean isMandatoryDeposit = false;
    private final String recurringFrequencyType = MONTHS;
    private final String recurringFrequency = "1";
    private final String depositAmount = "100000";
    private final String minDepositAmount = "100";
    private final String maxDepositAmount = "1000000";
    private Account[] accountList = null;
    private List<HashMap<String, String>> chartSlabs = null;
    private boolean isPrimaryGroupingByAmount = false;
    private Boolean withHoldTax = false;
    private String taxGroupId = null;

    public String build(final String validFrom, final String validTo) {
        final HashMap<String, Object> map = new HashMap<>();

        List<HashMap<String, Object>> charts = new ArrayList<HashMap<String, Object>>();
        HashMap<String, Object> chartsMap = new HashMap<>();
        chartsMap.put("fromDate", validFrom);
        chartsMap.put("endDate", validTo);
        chartsMap.put("dateFormat", "dd MMMM yyyy");
        chartsMap.put("locale", LOCALE);
        chartsMap.put("chartSlabs", chartSlabs);
        chartsMap.put("isPrimaryGroupingByAmount", this.isPrimaryGroupingByAmount);
        charts.add(chartsMap);

        map.put("charts", charts);
        map.put("name", this.name);
        map.put("shortName", this.shortName);
        map.put("description", this.description);
        map.put("currencyCode", this.currencyCode);
        map.put("interestCalculationDaysInYearType", this.interestCalculationDaysInYearType);
        map.put("locale", LOCALE);
        map.put("digitsAfterDecimal", DIGITS_AFTER_DECIMAL);
        map.put("inMultiplesOf", IN_MULTIPLES_OF);
        map.put("interestCalculationType", this.interestCalculationType);
        map.put("interestCompoundingPeriodType", this.interestCompoundingPeriodType);
        map.put("interestPostingPeriodType", this.interestPostingPeriodType);
        map.put("accountingRule", this.accountingRule);
        map.put("lockinPeriodFrequency", this.lockinPeriodFrequency);
        map.put("lockinPeriodFrequencyType", this.lockingPeriodFrequencyType);
        map.put("preClosurePenalApplicable", "true");
        map.put("minDepositTermTypeId", this.minDepositTermTypeId);
        map.put("minDepositTerm", this.minDepositTerm);
        map.put("maxDepositTermTypeId", this.maxDepositTermTypeId);
        map.put("maxDepositTerm", this.maxDepositTerm);
        map.put("preClosurePenalApplicable", this.preClosurePenalApplicable);
        map.put("inMultiplesOfDepositTerm", this.inMultiplesOfDepositTerm);
        map.put("inMultiplesOfDepositTermTypeId", this.inMultiplesOfDepositTermTypeId);
        map.put("preClosurePenalInterest", this.preClosurePenalInterest);
        map.put("preClosurePenalInterestOnTypeId", this.preClosurePenalInterestOnTypeId);
        map.put("isMandatoryDeposit", this.isMandatoryDeposit);
        map.put("recurringFrequencyType", this.recurringFrequencyType);
        map.put("depositAmount", this.depositAmount);
        map.put("recurringFrequency", this.recurringFrequency);
        map.put("depositAmount", this.depositAmount);
        map.put("minDepositAmount", this.minDepositAmount);
        map.put("maxDepositAmount", this.maxDepositAmount);
        map.put("withHoldTax", this.withHoldTax.toString());
        if (withHoldTax) {
            map.put("taxGroupId", taxGroupId);
        }

        if (this.accountingRule.equals(CASH_BASED)) {
            map.putAll(getAccountMappingForCashBased());
        }

        String RecurringDepositProductCreateJson = new Gson().toJson(map);
        LOG.info("{}", RecurringDepositProductCreateJson);
        return RecurringDepositProductCreateJson;
    }

    public RecurringDepositProductHelper withAccountingRuleAsNone() {
        this.accountingRule = NONE;
        return this;
    }

    public RecurringDepositProductHelper withAccountingRuleAsCashBased(final Account[] account_list) {
        this.accountingRule = CASH_BASED;
        this.accountList = account_list;
        return this;
    }

    public RecurringDepositProductHelper withPeriodRangeChart() {
        this.chartSlabs = constructChartSlabWithPeriodRange();
        return this;
    }

    public RecurringDepositProductHelper withPeriodAndAmountRangeChart() {
        this.chartSlabs = constructChartSlabWithPeriodAndAmountRange();
        return this;
    }

    public RecurringDepositProductHelper withAmountRangeChart() {
        this.chartSlabs = constructChartSlabWithAmountRange();
        return this;
    }

    public RecurringDepositProductHelper withAmountAndPeriodRangeChart() {
        this.chartSlabs = constructChartSlabWithAmountAndPeriodRange();
        return this;
    }

    public RecurringDepositProductHelper withWithHoldTax(final String taxGroupId) {
        if (taxGroupId != null) {
            this.withHoldTax = true;
            this.taxGroupId = taxGroupId;
        }
        return this;
    }

    private Map<String, String> getAccountMappingForCashBased() {
        final Map<String, String> map = new HashMap<>();
        if (accountList != null) {
            for (int i = 0; i < this.accountList.length; i++) {
                if (this.accountList[i].getAccountType().equals(Account.AccountType.ASSET)) {
                    final String ID = this.accountList[i].getAccountID().toString();
                    map.put("savingsReferenceAccountId", ID);
                }
                if (this.accountList[i].getAccountType().equals(Account.AccountType.LIABILITY)) {
                    final String ID = this.accountList[i].getAccountID().toString();
                    map.put("savingsControlAccountId", ID);
                    map.put("transfersInSuspenseAccountId", ID);
                }
                if (this.accountList[i].getAccountType().equals(Account.AccountType.EXPENSE)) {
                    final String ID = this.accountList[i].getAccountID().toString();
                    map.put("interestOnSavingsAccountId", ID);
                }
                if (this.accountList[i].getAccountType().equals(Account.AccountType.INCOME)) {
                    final String ID = this.accountList[i].getAccountID().toString();
                    map.put("incomeFromFeeAccountId", ID);
                    map.put("incomeFromPenaltyAccountId", ID);
                }
            }
        }
        return map;
    }

    public static Integer createRecurringDepositProduct(final String recurrungDepositProductCreateJson,
            final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
        LOG.info("------------------ CREATING RECURRING DEPOSIT PRODUCT--------------------");
        return Utils.performServerPost(requestSpec, responseSpec, CREATE_RECURRING_DEPOSIT_PRODUCT_URL, recurrungDepositProductCreateJson,
                "resourceId");
    }

    public static ArrayList retrieveAllRecurringDepositProducts(final RequestSpecification requestSpec,
            final ResponseSpecification responseSpec) {
        LOG.info("----------------- RETRIEVING ALL RECURRING DEPOSIT PRODUCTS---------------------------");
        final ArrayList response = Utils.performServerGet(requestSpec, responseSpec,
                RECURRING_DEPOSIT_PRODUCT_URL + "?" + Utils.TENANT_IDENTIFIER, "");
        return response;
    }

    public static GetRecurringDepositProductsProductIdResponse getRecurringDepositProductById(final RequestSpecification requestSpec,
            final ResponseSpecification responseSpec, final Integer productId) {
        LOG.info("-------------------- RETRIEVING RECURRING DEPOSIT PRODUCT BY ID --------------------------");
        final String GET_RD_PRODUCT_BY_ID_URL = RECURRING_DEPOSIT_PRODUCT_URL + "/" + productId + "?" + Utils.TENANT_IDENTIFIER;
        final String response = Utils.performServerGet(requestSpec, responseSpec, GET_RD_PRODUCT_BY_ID_URL);
        return GSON.fromJson(response, GetRecurringDepositProductsProductIdResponse.class);
    }

    public static HashMap retrieveRecurringDepositProductById(final RequestSpecification requestSpec,
            final ResponseSpecification responseSpec, final String productId) {
        LOG.info("-------------------- RETRIEVING RECURRING DEPOSIT PRODUCT BY ID --------------------------");
        final String GET_RD_PRODUCT_BY_ID_URL = RECURRING_DEPOSIT_PRODUCT_URL + "/" + productId + "?" + Utils.TENANT_IDENTIFIER;
        final HashMap response = Utils.performServerGet(requestSpec, responseSpec, GET_RD_PRODUCT_BY_ID_URL, "");
        return response;
    }

    public static ArrayList getInterestRateChartSlabsByProductId(final RequestSpecification requestSpec,
            final ResponseSpecification responseSpec, final Integer productId) {
        LOG.info("-------------------- RETRIEVE INTEREST CHART BY PRODUCT ID ---------------------");
        final ArrayList response = Utils.performServerGet(requestSpec, responseSpec, INTEREST_CHART_URL + "?productId=" + productId,
                "chartSlabs");
        return response;
    }

    public List<HashMap<String, String>> constructChartSlabWithPeriodRange() {
        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
        chartSlabsMap1.put("description", "First");
        chartSlabsMap1.put("periodType", MONTHS);
        chartSlabsMap1.put("fromPeriod", "1");
        chartSlabsMap1.put("toPeriod", "6");
        chartSlabsMap1.put("annualInterestRate", "5");
        chartSlabsMap1.put("locale", LOCALE);
        chartSlabs.add(0, chartSlabsMap1);

        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
        chartSlabsMap2.put("description", "Second");
        chartSlabsMap2.put("periodType", MONTHS);
        chartSlabsMap2.put("fromPeriod", "7");
        chartSlabsMap2.put("toPeriod", "12");
        chartSlabsMap2.put("annualInterestRate", "6");
        chartSlabsMap2.put("locale", LOCALE);
        chartSlabs.add(1, chartSlabsMap2);

        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
        chartSlabsMap3.put("description", "Third");
        chartSlabsMap3.put("periodType", MONTHS);
        chartSlabsMap3.put("fromPeriod", "13");
        chartSlabsMap3.put("toPeriod", "18");
        chartSlabsMap3.put("annualInterestRate", "7");
        chartSlabsMap3.put("locale", LOCALE);
        chartSlabs.add(2, chartSlabsMap3);

        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
        chartSlabsMap4.put("description", "Fourth");
        chartSlabsMap4.put("periodType", MONTHS);
        chartSlabsMap4.put("fromPeriod", "19");
        chartSlabsMap4.put("annualInterestRate", "8");
        chartSlabsMap4.put("locale", LOCALE);
        chartSlabs.add(3, chartSlabsMap4);
        return chartSlabs;
    }

    public List<HashMap<String, String>> constructChartSlabWithPeriodAndAmountRange() {
        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
        chartSlabsMap1.put("description", "First");
        chartSlabsMap1.put("periodType", MONTHS);
        chartSlabsMap1.put("fromPeriod", "1");
        chartSlabsMap1.put("toPeriod", "6");
        chartSlabsMap1.put("amountRangeFrom", "1");
        chartSlabsMap1.put("amountRangeTo", "5000");
        chartSlabsMap1.put("annualInterestRate", "5");
        chartSlabsMap1.put("locale", LOCALE);
        chartSlabs.add(0, chartSlabsMap1);

        HashMap<String, String> chartSlabsMap1_1 = new HashMap<>();
        chartSlabsMap1_1.put("description", "First");
        chartSlabsMap1_1.put("periodType", MONTHS);
        chartSlabsMap1_1.put("fromPeriod", "1");
        chartSlabsMap1_1.put("toPeriod", "6");
        chartSlabsMap1_1.put("amountRangeFrom", "5001");
        chartSlabsMap1_1.put("annualInterestRate", "6");
        chartSlabsMap1_1.put("locale", LOCALE);
        chartSlabs.add(0, chartSlabsMap1_1);

        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
        chartSlabsMap2.put("description", "Second");
        chartSlabsMap2.put("periodType", MONTHS);
        chartSlabsMap2.put("fromPeriod", "7");
        chartSlabsMap2.put("toPeriod", "12");
        chartSlabsMap2.put("amountRangeFrom", "1");
        chartSlabsMap2.put("amountRangeTo", "5000");
        chartSlabsMap2.put("annualInterestRate", "6");
        chartSlabsMap2.put("locale", LOCALE);
        chartSlabs.add(1, chartSlabsMap2);

        HashMap<String, String> chartSlabsMap2_2 = new HashMap<>();
        chartSlabsMap2_2.put("description", "Second");
        chartSlabsMap2_2.put("periodType", MONTHS);
        chartSlabsMap2_2.put("fromPeriod", "7");
        chartSlabsMap2_2.put("toPeriod", "12");
        chartSlabsMap2_2.put("amountRangeFrom", "5001");
        chartSlabsMap2_2.put("annualInterestRate", "7");
        chartSlabsMap2_2.put("locale", LOCALE);
        chartSlabs.add(1, chartSlabsMap2_2);

        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
        chartSlabsMap3.put("description", "Third");
        chartSlabsMap3.put("periodType", MONTHS);
        chartSlabsMap3.put("fromPeriod", "13");
        chartSlabsMap3.put("toPeriod", "18");
        chartSlabsMap3.put("amountRangeFrom", "1");
        chartSlabsMap3.put("amountRangeTo", "5000");
        chartSlabsMap3.put("annualInterestRate", "7");
        chartSlabsMap3.put("locale", LOCALE);
        chartSlabs.add(2, chartSlabsMap3);

        HashMap<String, String> chartSlabsMap3_1 = new HashMap<>();
        chartSlabsMap3_1.put("description", "Third");
        chartSlabsMap3_1.put("periodType", MONTHS);
        chartSlabsMap3_1.put("fromPeriod", "13");
        chartSlabsMap3_1.put("toPeriod", "18");
        chartSlabsMap3_1.put("amountRangeFrom", "5001");
        chartSlabsMap3_1.put("annualInterestRate", "8");
        chartSlabsMap3_1.put("locale", LOCALE);
        chartSlabs.add(2, chartSlabsMap3_1);

        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
        chartSlabsMap4.put("description", "Fourth");
        chartSlabsMap4.put("periodType", MONTHS);
        chartSlabsMap4.put("fromPeriod", "19");
        chartSlabsMap4.put("amountRangeFrom", "1");
        chartSlabsMap4.put("amountRangeTo", "5000");
        chartSlabsMap4.put("annualInterestRate", "8");
        chartSlabsMap4.put("locale", LOCALE);
        chartSlabs.add(3, chartSlabsMap4);

        HashMap<String, String> chartSlabsMap4_1 = new HashMap<>();
        chartSlabsMap4_1.put("description", "Fourth");
        chartSlabsMap4_1.put("periodType", MONTHS);
        chartSlabsMap4_1.put("fromPeriod", "19");
        chartSlabsMap4_1.put("amountRangeFrom", "5001");
        chartSlabsMap4_1.put("annualInterestRate", "9");
        chartSlabsMap4_1.put("locale", LOCALE);
        chartSlabs.add(3, chartSlabsMap4_1);

        return chartSlabs;
    }

    public List<HashMap<String, String>> constructChartSlabWithAmountAndPeriodRange() {
        this.isPrimaryGroupingByAmount = true;
        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
        chartSlabsMap1.put("description", "First");
        chartSlabsMap1.put("periodType", MONTHS);
        chartSlabsMap1.put("amountRangeFrom", "1");
        chartSlabsMap1.put("amountRangeTo", "5000");
        chartSlabsMap1.put("fromPeriod", "1");
        chartSlabsMap1.put("toPeriod", "6");
        chartSlabsMap1.put("annualInterestRate", "5");
        chartSlabsMap1.put("locale", LOCALE);
        chartSlabs.add(0, chartSlabsMap1);

        HashMap<String, String> chartSlabsMap2 = new HashMap<>();
        chartSlabsMap2.put("description", "Second");
        chartSlabsMap2.put("periodType", MONTHS);
        chartSlabsMap2.put("fromPeriod", "7");
        chartSlabsMap2.put("amountRangeFrom", "1");
        chartSlabsMap2.put("amountRangeTo", "5000");
        chartSlabsMap2.put("annualInterestRate", "6");
        chartSlabsMap2.put("locale", LOCALE);
        chartSlabs.add(1, chartSlabsMap2);

        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
        chartSlabsMap3.put("description", "Third");
        chartSlabsMap3.put("periodType", MONTHS);
        chartSlabsMap3.put("fromPeriod", "1");
        chartSlabsMap3.put("toPeriod", "6");
        chartSlabsMap3.put("amountRangeFrom", "5001");
        chartSlabsMap3.put("annualInterestRate", "7");
        chartSlabsMap3.put("locale", LOCALE);
        chartSlabs.add(2, chartSlabsMap3);

        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
        chartSlabsMap4.put("description", "Fourth");
        chartSlabsMap4.put("periodType", MONTHS);
        chartSlabsMap4.put("fromPeriod", "7");
        chartSlabsMap4.put("amountRangeFrom", "5001");
        chartSlabsMap4.put("annualInterestRate", "8");
        chartSlabsMap4.put("locale", LOCALE);
        chartSlabs.add(3, chartSlabsMap4);

        return chartSlabs;
    }

    public List<HashMap<String, String>> constructChartSlabWithAmountRange() {
        this.isPrimaryGroupingByAmount = true;
        List<HashMap<String, String>> chartSlabs = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> chartSlabsMap1 = new HashMap<>();
        chartSlabsMap1.put("description", "First");
        chartSlabsMap1.put("amountRangeFrom", "1");
        chartSlabsMap1.put("amountRangeTo", "5000");
        chartSlabsMap1.put("annualInterestRate", "5");
        chartSlabsMap1.put("locale", LOCALE);
        chartSlabs.add(0, chartSlabsMap1);

        HashMap<String, String> chartSlabsMap3 = new HashMap<>();
        chartSlabsMap3.put("description", "Third");
        chartSlabsMap3.put("amountRangeFrom", "5001");
        chartSlabsMap3.put("amountRangeTo", "10000");
        chartSlabsMap3.put("annualInterestRate", "7");
        chartSlabsMap3.put("locale", LOCALE);
        chartSlabs.add(1, chartSlabsMap3);

        HashMap<String, String> chartSlabsMap4 = new HashMap<>();
        chartSlabsMap4.put("description", "Fourth");
        chartSlabsMap4.put("amountRangeFrom", "10001");
        chartSlabsMap4.put("annualInterestRate", "8");
        chartSlabsMap4.put("locale", LOCALE);
        chartSlabs.add(2, chartSlabsMap4);

        return chartSlabs;
    }

}
