<?php
/**
 * Created by PhpStorm.
 * User: sunil
 * Date: 12/11/18
 * Time: 2:02 PM
 */

namespace App\Imports;

use App\BulkPayments;
use App\Console\Commands\TallyBridge;
use App\ConsumerApplication;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\LoanManagement;
use App\Mandate;
use App\MandateLogs;
use App\PaymentTransaction;
use App\ProFormaInvoice;
use App\Settlement;
use App\Slack;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\ToCollection;

class LotusPayPaymentFile
{
    private $request;

    public function __construct(Request $request){
        $this->request = $request;
    }

    public function collection($data)
    {
        $consumerApplication = new ConsumerApplicationController();
        // TODO: Implement collection() method.
        //$data = $collection->toArray();
        $payment_date = Carbon::parse($this->request->get('emi_date'))->toDateString();
        $payment_reconciliation_date = Carbon::parse($this->request->get('payment_reconciliation_date'))->toDateString();
        $payment_mode = $this->request->get('payment_mode') ?? "NACH-LOTUS";
        $totalAmountReceived = 0;
        $tallyData = [];

        $payment_date_with_time = Carbon::parse($this->request->get('emi_date'))->startOfDay()->toDateTimeString();

        (new Slack(new Request(['title' => 'Bulk ID summary', 'fields' => ['data_count' => count($data), 'request' => json_encode($this->request->all())], 'group' => Slack::$STAGE_TESTING])))->send();

        foreach ($data as $item) {

            try {
                $PaymentEmi = new LoanManagement();
                $execution_status = [];
                $bulk_payment_id = isset($item['bulk_payment_id']) ? $item['bulk_payment_id'] : 0;
                $item = isset($item['item']) ? $item['item'] : $item;

                $status = $item[6];
                $application_id = $item[5];
                $execution_status['status'] = $status;
                if ($application_id && $this->isProcessed($payment_date_with_time, $status, $application_id)) {
                    if ($application_id > 0) {
                        //$bank_id = (new ConsumerApplicationController())->getTransactionBank($item[5]);
                        $paymentReconcileData = [
                            'amount' => $item[0],
                            'payment_date' => $payment_date,
                            'mode' => $payment_mode,
                            'paid_by' => "",
                            'collected_by' => 0,
                            'wallet_name' => "",
                            'bank_id' => 4,
                            'trasanction_id' => $item[3],
                            'online_payment_id' => 0,
                            'trasanction_acknowledgement' => "",
                            'payment_reconciliation_date' => $payment_reconciliation_date,
                            'status' => $status,
                            'reason' => '',
                            'umrn' => $item[4],
                            'application_id' => $item[5]
                        ];
                        $communicationData = $PaymentEmi->paymentReconcile($paymentReconcileData);
                        $execution_status['reconciled'] = 1;
                        if ($status == 'success') {
                            $tallyData[] = $paymentReconcileData;
                            $totalAmountReceived += (int)$item[0];
                        }

                    } else {
                        $this->mismatchedPayment($item, $payment_date, 0, $consumerApplication);
                        $execution_status['mismatch'] = 1;
                    }
                } else {
                    $execution_status['already_processed'] = 1;
                }

                if ($bulk_payment_id) {
//                    BulkPayments::where('id', $bulk_payment_id)->update(['execution_status' => json_encode($execution_status), 'communication' => 0, 'communication_data' => json_encode($communicationData ?? [])]);
                    BulkPayments::where('id', $bulk_payment_id)->update(['execution_status' => json_encode($execution_status), 'communication' => 0, 'communication_data' => '[]']);
                } else {
                    (new Slack(new Request(['title' => 'Bulk ID error', 'fields' => ['data' => json_encode($item)], 'group' => Slack::$STAGE_TESTING])))->send();
                }
            }catch (\Exception $exception){
                (new Slack(new Request(['title' => 'Payment upload error', 'fields' => ['e' => $exception->getMessage(),'l' => $exception->getLine(),'t' => $exception->getTraceAsString(),'item' => isset($item) ? $item : '', 'payment_date' => $payment_date, 'payment_reconciliation_date' => $payment_reconciliation_date], 'group' => 'payment_collection'])))->send();
            }
        }

        if($totalAmountReceived && $tallyData){
            Settlement::import(['data' => $tallyData, 'settled_amount' => $totalAmountReceived, 'payment_date' => $payment_date, 'reconciliation_date' => $payment_reconciliation_date, 'type' => 'lotuspay']);
        }
    }

    public function mismatchedPayment($item, $payment_date, $type, ConsumerApplicationController $consumerApplication){
        //send mismatched payments to slack
        $application = ConsumerApplication::where('id', $item[5])->first(['id','name']);
        $data = [
            'bank' => 'LotusPay',
            //'umrn' => $item[22],
            'payment_date' => $payment_date,
            'amount' => $item[0],
            'name' => $application->name,
            'status' => $item[6]
        ];

        $consumerApplication->sendslackmessage(0,'mismatchedPayment',$data);
    }

    public function isProcessed($payment_date, $status, $application_id){
        $payment = PaymentTransaction::where('application_id', $application_id)->where('mode', 'NACH-LOTUS')->where('payment_date',$payment_date)->whereNull('is_deleted_at')->first(['id','status']);
        return (isset($payment->id) && strtolower($payment->status) == strtolower($status)) ? false : true;
    }
}
