import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta
from utils import get_cloudwatch_logger
logger = get_cloudwatch_logger(stream_name="subvention_rps")

async def function1(data):

    logger.send_log_event(f"INFO: In subvention rps function - Request received: {data}")

    loan_principal = data["loan_principal"]
    remaining_emi = data["remaining_emi"]
    first_emi_date = datetime.strptime(data["first_emi_date_str"], "%d-%m-%Y").date()
    morat_months = data["morat_months"]
    morat_start_date = (
            datetime.strptime(data["morat_start_date_str"], '%d-%m-%Y').date()
            if morat_months > 0
            else datetime.strptime('05-11-2016', '%d-%m-%Y').date()
        )
    emi_amount = loan_principal/remaining_emi

    # calculate final tenure
    extended_tenure = remaining_emi + morat_months
    morat_start_date_array = []
    current_date = morat_start_date
    for i in range(morat_months):
        morat_start_date_array.append(current_date)
        current_date = current_date + relativedelta(months=1)

    amort_array = []
    emi_date = first_emi_date
    pos = loan_principal

    for period in range(1, extended_tenure + 1):
        is_moratorium = emi_date in morat_start_date_array

        if is_moratorium:
            morat_interest = pos * 0.02
            interest_comp = 0
            principal_comp = 0
            emi = 0
        else:
            morat_interest = 0
            interest_comp = 0
            principal_comp = emi_amount
            pos -= principal_comp
            emi = emi_amount

        amort_array.append({
            'installment_number': period,
            'emi_date': emi_date,
            'morat_interest': morat_interest,
            'interest_comp': interest_comp,
            'principal_comp': principal_comp,
            'emi_amount': emi,
            'principal_outstanding': pos
        })

        emi_date += relativedelta(months=1)

    df_amort = pd.DataFrame(amort_array)


    # Last EMI Calculation
    all_emi_sum = df_amort['emi_amount'].sum()
    all_emi_sum_excl_last = df_amort['emi_amount'].iloc[:-1].round().sum()
    last_emi_value = all_emi_sum - all_emi_sum_excl_last
    df_amort.at[df_amort.index[-1],'emi_amount'] = last_emi_value
    df_amort['principal_comp'] = df_amort['emi_amount']


    # Round off values and add additional columns
    df_amort['emi_amount'] = df_amort['emi_amount'].round()
    df_amort['morat_interest'] = df_amort['morat_interest'].round()

    df_amort['total_payable'] = df_amort[['morat_interest', 'interest_comp', 'principal_comp']].sum(axis=1).round()
    df_amort['due_date'] = df_amort['emi_date'].apply(lambda x: x + relativedelta(days=1) if x.weekday() == 6 else x) # if emi_date on sunday, add 1 day 
    df_amort['installment_number'] = (df_amort['principal_comp'] != 0).cumsum()
    df_amort['foreclosure_amount'] = df_amort['principal_outstanding']
    df_amort.at[len(df_amort)-1, 'foreclosure_amount'] = 0

    df_amort = df_amort[['installment_number','emi_date','due_date','morat_interest','interest_comp','principal_comp',
                         'emi_amount','total_payable','principal_outstanding','foreclosure_amount']]

    result = {
    "repayable": float(df_amort['total_payable'].sum()),
    "principal_amount": float(df_amort['principal_comp'].sum()),
    "subvention": 0,
    "total_interest": float(df_amort['interest_comp'].sum()),
    "total_subvention": 0,
    "interest_rate": 0,
    "annualized_interest_rate": 0,
    "rps_json": df_amort.to_dict(orient='records')
    }
    logger.send_log_event("INFO: Response generated successfully.")
    return result