<?php

namespace App;

use App\Http\Controllers\Admin\AccountingController;
use App\Http\Controllers\Admin\LenderServices;
use App\ABFL\Services\Services;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Http\Request;
use MathPHP\Finance;

class Moratorium extends Model
{


    use SoftDeletes;

    protected $table = 'moratorium';

    protected $fillable = ['application_id','emi_date','interest_rate','stopped_by','started_date','stopped_date','user_id','status'];

    public function user(){
        return $this->hasOne('App\User','id','user_id');
    }

    public function stopped(){
        return $this->hasOne('App\User','id','stopped_by');
    }

    public function getSchedule($id){
        $application = ConsumerApplication::with('emi')->where('id',$id)->first();

        $id = $application->id;
        $payment = new PaymentEmi();
        $emi_dues =  $payment->generateDues($id,1, true);
        $loanamount = ((isset($application->approved_amount) && $application->approved_amount != 0) ? $application->approved_amount : $application->loan_amount) - $application->emi->upfront_from_customer;
        $subvention_amount = (isset($application->emi->subvention) && $application->emi->subvention > 0) ? ((((isset($application->approved_amount) && $application->approved_amount != 0) ? $application->approved_amount : $application->loan_amount)* ($application->emi->subvention))/100) : 0;
        $amount_disbursed = $loanamount - $subvention_amount;
        $i = 0;


        $emis_array = array();
        $emi_irr_array = array();
        array_push($emis_array, -$loanamount);
        array_push($emi_irr_array, -($amount_disbursed));

        if (isset($emi_dues['payload'])) {
            foreach ($emi_dues['payload'] as $emis) {
                array_push($emis_array, $emis['amount']);
                array_push($emi_irr_array, $emis['amount']);

            }
        }
        $rate = (Finance::irr($emis_array)) * 100;
        if ($rate < 0) {
            $rate = 0;
        }

        $irr_rate = (Finance::irr($emi_irr_array)) * 100;
        if ($irr_rate < 0) {
            $irr_rate = 0;
        }

        $loan_amount_subvention = $loanamount - $subvention_amount;
        $principal_outstanding = 0;

        $i = 0;
        if(isset($emi_dues['payload'])){
            $principal_oustanding = $loanamount;
            $principal_oustanding_subvention = $loan_amount_subvention;
            $subvention_amount_balance = $subvention_amount;
            foreach ($emi_dues['payload'] as $emis){
                //if($emis['emi_date'] <= Carbon::createFromFormat('Y-m-d', $moratorium->emi_date)->addMonth(1)->endOfMonth()->toDateString()) {
                $emi_dues['payload'][$i]['interest'] = $principal_oustanding * ($rate / 100);
                $emi_dues['payload'][$i]['principal'] = $emis['amount'] - $emi_dues['payload'][$i]['interest'];
                $emi_dues['payload'][$i]['irr'] = $principal_oustanding_subvention * ($irr_rate / 100);
                $emi_dues['payload'][$i]['subvention'] = $emi_dues['payload'][$i]['irr'] - $emi_dues['payload'][$i]['interest'];
                $subvention_amount_balance = $subvention_amount_balance - $emi_dues['payload'][$i]['subvention'];
                $emi_dues['payload'][$i]['subvention_amount_balance'] = $subvention_amount_balance;
                $principal_oustanding = $principal_oustanding - $emi_dues['payload'][$i]['principal'];
                $principal_oustanding_subvention = $principal_oustanding_subvention - $emi_dues['payload'][$i]['principal'] + $emi_dues['payload'][$i]['subvention'];
                $emi_dues['payload'][$i]['principal_outstanding'] = $principal_oustanding;
                $emi_dues['payload'][$i]['principal_outstanding_subvention'] = $principal_oustanding_subvention;
                $i++;
                //}
            }
        }

        return $emi_dues;
    }

    public function getPrincipalOutstanding($id, $moratorium, $emi_date = null){

        if(!isset($id->id)){
            $application = ConsumerApplication::with('emi')->where('id',$id)->first();
        }else{
            $application = $id;
        }

        $id = $application->id;
        $payment = new PaymentEmi();
        $emi_dues =  $payment->generateDues($id,1, true);
        $loanamount = ((isset($application->approved_amount) && $application->approved_amount != 0) ? $application->approved_amount : $application->loan_amount) - $application->emi->upfront_from_customer;
        $subvention_amount = (isset($application->emi->subvention) && $application->emi->subvention > 0) ? ((((isset($application->approved_amount) && $application->approved_amount != 0) ? $application->approved_amount : $application->loan_amount)* ($application->emi->subvention))/100) : 0;
        $amount_disbursed = $loanamount - $subvention_amount;
        $i = 0;


        $emis_array = array();
        $emi_irr_array = array();
        array_push($emis_array, -$loanamount);
        array_push($emi_irr_array, -($amount_disbursed));

        if (isset($emi_dues['payload'])) {
            foreach ($emi_dues['payload'] as $emis) {
                array_push($emis_array, $emis['amount']);
                array_push($emi_irr_array, $emis['amount']);

            }
        }
        $rate = (Finance::irr($emis_array)) * 100;
        if ($rate < 0) {
            $rate = 0;
        }

        if(isset($application->lender_id) && $application->lender_id == Services::$lender_id) {
            $lenderServices = new LenderServices(new Request(['id' => $id]));
            $rate = $lenderServices->getPayloadValueByID($id, 'roi') / 100;
        }

        $irr_rate = (Finance::irr($emi_irr_array)) * 100;
        if ($irr_rate < 0) {
            $irr_rate = 0;
        }

        $loan_amount_subvention = $loanamount - $subvention_amount;
        $principal_outstanding = 0;

        $i = 0;
        if(isset($emi_dues['payload'])){
            $principal_oustanding = $loanamount;
            $principal_oustanding_subvention = $loan_amount_subvention;
            $subvention_amount_balance = $subvention_amount;
            foreach ($emi_dues['payload'] as $emis){
                //if($emis['emi_date'] <= Carbon::createFromFormat('Y-m-d', $moratorium->emi_date)->addMonth(1)->endOfMonth()->toDateString()) {
                $emi_dues['payload'][$i]['interest'] = $principal_oustanding * ($rate / 100);
                $emi_dues['payload'][$i]['principal'] = $emis['amount'] - $emi_dues['payload'][$i]['interest'];
                $emi_dues['payload'][$i]['irr'] = $principal_oustanding_subvention * ($irr_rate / 100);
                $emi_dues['payload'][$i]['subvention'] = $emi_dues['payload'][$i]['irr'] - $emi_dues['payload'][$i]['interest'];
                $subvention_amount_balance = $subvention_amount_balance - $emi_dues['payload'][$i]['subvention'];
                $emi_dues['payload'][$i]['subvention_amount_balance'] = $subvention_amount_balance;
                $principal_oustanding = $principal_oustanding - $emi_dues['payload'][$i]['principal'];
                $principal_oustanding_subvention = $principal_oustanding_subvention - $emi_dues['payload'][$i]['principal'] + $emi_dues['payload'][$i]['subvention'];
                $emi_dues['payload'][$i]['principal_outstanding'] = $principal_oustanding;
                $emi_dues['payload'][$i]['principal_outstanding_subvention'] = $principal_oustanding_subvention;
                $i++;
                //}
            }
        }


        $moratoriumTable = Moratorium::where('application_id',$id)->orderBy('emi_date','desc')->get();
        $moratoriumTableExist = [];
        foreach ($moratoriumTable as $moratoriumTableItem){
            $moratoriumTableExist[] = $moratoriumTableItem->emi_date;
            $moratoriumTableExistInterest[$moratoriumTableItem->emi_date] = $moratoriumTableItem->interest_rate;
        }

        $amount = 0;
        foreach ($emi_dues['payload'] as $emis){
            if($emis['emi_date'] == Carbon::createFromFormat('Y-m-d', $moratorium->emi_date)->addMonth(1)->toDateString()) {
                $check = true;
                $cc = 0;
                $date = $emis['emi_date'];
                while ($check) {
                    $date = Carbon::createFromFormat('Y-m-d', $date)->subMonth(1)->toDateString();
                    if (in_array($date, $moratoriumTableExist)) {
                        $principal_outstanding = isset($emis['principal_outstanding']) ? $emis['principal_outstanding'] + $emis['amount'] : 0;
                        $amount += ($principal_outstanding * $moratoriumTableExistInterest[$date]) / 100;
                    }else{
                        break;
                    }
                    $cc++;
                }

                if ($emis['emi_date'] == Carbon::createFromFormat('Y-m-d', $moratorium->emi_date)->addMonth(1)->toDateString()) {
                    //return round($amount * $cc);
                    break;
                }
            }
        }
        return round($amount);
        /*$i = 0;
        if(isset($emi_dues['payload'])){
            $principal_oustanding = $loanamount;
            $principal_oustanding_subvention = $loan_amount_subvention;
            $subvention_amount_balance = $subvention_amount;
            foreach ($emi_dues['payload'] as $emis){
                //if($emis['emi_date'] <= Carbon::createFromFormat('Y-m-d', $moratorium->emi_date)->addMonth(1)->endOfMonth()->toDateString()) {
                    $emi_dues['payload'][$i]['interest'] = $principal_oustanding * ($rate / 100);
                    $emi_dues['payload'][$i]['principal'] = $emis['amount'] - $emi_dues['payload'][$i]['interest'];
                    $emi_dues['payload'][$i]['irr'] = $principal_oustanding_subvention * ($irr_rate / 100);
                    $emi_dues['payload'][$i]['subvention'] = $emi_dues['payload'][$i]['irr'] - $emi_dues['payload'][$i]['interest'];
                    $subvention_amount_balance = $subvention_amount_balance - $emi_dues['payload'][$i]['subvention'];
                    $emi_dues['payload'][$i]['subvention_amount_balance'] = $subvention_amount_balance;
                    $principal_oustanding = $principal_oustanding - $emi_dues['payload'][$i]['principal'];
                    $principal_oustanding_subvention = $principal_oustanding_subvention - $emi_dues['payload'][$i]['principal'] + $emi_dues['payload'][$i]['subvention'];
                    $emi_dues['payload'][$i]['principal_outstanding'] = $principal_oustanding;
                    $emi_dues['payload'][$i]['principal_outstanding_subvention'] = $principal_oustanding_subvention;
                    $i++;
                //}
            }
        }*/



        /*$moraAmount = [];
        foreach ($emi_dues['payload'] as $c => $item){*/
            /* --- if($item['emi_date'] <= $moratorium->emi_date){
                $principal_outstanding = isset($emi_dues['beforePayload'][$c]['principal_outstanding']) ? $emi_dues['beforePayload'][$c]['principal_outstanding'] + $emi_dues['beforePayload'][$c]['amount'] : 0;
                $moraAmount[$moratorium->emi_date] = round($principal_outstanding * $moratorium->interest_rate / 100);
            } --- */
            /*if(in_array($item['emi_date'], $moratoriumTableExist)) {
                $principal_outstanding = isset($emi_dues['payload'][$c]['principal_outstanding']) ? $emi_dues['payload'][$c]['principal_outstanding'] + $emi_dues['payload'][$c]['amount'] : 0;
                $moraAmount[$item['emi_date']] = round($principal_outstanding * $moratorium->interest_rate / 100);
            }*/
        /*}*/


        /*$amount = 0;
        $check = true;
        $cc = 0;
        $date = $moratorium->emi_date;
        while ($check){
            $cc++;
            $date = Carbon::createFromFormat('Y-m-d', $date)->subMonth(1)->toDateString();
            if(!in_array($date, $moratoriumTableExist)){
                $check = false;
                $date = Carbon::createFromFormat('Y-m-d', $date)->addMonth(1)->toDateString();
                $amount = $moraAmount[$date] * $cc;
                break;
            }
        }
        return $amount;*/
    }
}
