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

namespace App\Imports;

use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Mandate;
use App\ProFormaInvoice;
use App\Slack;
use function GuzzleHttp\Psr7\_parse_request_uri;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\ToCollection;

class MandateFile implements ToCollection
{

    use Importable;
    private $request;
    public $nach_updated = 0;

    private $mandateStatus = ['ACCEPTED' => 'accepted', 'REJECTED' => 'rejected'];

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

    /**
     * @param Collection $collection
     */
    public function collection(Collection $collection)
    {
        // TODO: Implement collection() method.
        $consumerApplication = new ConsumerApplicationController();
        $data = $collection->toArray();
        unset($data[0]);
        foreach ($data as $item){
            try {
                if (isset($item[21]) && !empty($item[21])) {
                    $status = false;
                    if ($this->isProcessed($item[21], $item[22]) && $application_id = $this->getApplicationID($item[11])) {
                        $mandateData = $this->getMandateData($item);
                        $mandate = Mandate::where('consumer_application_id', $application_id)->where('mode', 'nach')->where('frequency', $mandateData['frequency'])->whereNotIn('status', ['inactive', 'rejected'])->first(['id', 'mandate_amount', 'umrn']);
                        if (isset($mandate->id) && (empty($mandate->umrn) || is_null($mandate->umrn) || $mandate->umrn != '')) {
                            $consumerApplication->updateMandateSingle($mandate->id, $mandateData, $application_id);
                            $this->nach_updated++;
                            $status = true;
                        }
                    }

                    if (!$status) {
                        $this->mismatchedMandate($item, $consumerApplication);
                    }
                }
            }catch (\Exception $e){
                $failedIds[] = ['UMRN' => $item[21], 'Message' => $e->getMessage(), 'Line' => $e->getLine(), 'File' => $e->getFile()];
            }
        }

        if(isset($failedIds)) {
            (new Slack(new Request(['title' => 'Mandate Failed', 'fields' => ['Failed Ids' => json_encode($failedIds)], 'group' => Slack::$NACH_ERROR])))->send();
        }
        return $this->nach_updated;
    }

    public function getMandateData($item){
        return [
            'mandate_date' => date('Y-m-d', ($item[0] - 25569) * 86400),
            'debit_amount_upto_max_amount' => $item[9],
            'loan_application_no' => $item[11],
            'frequency' => ($item[13] == 'MNTH') ? 'M' : 'O',
            'mobile_number' => $item[19],
            'umrn' => $item[21],
            'mandate_status' => $item[22],
            'rejection_code' => $item[23],
            'rejection_reason' => $item[24],
            'initial_reject_reason' => $item[25]
        ];
    }

    public function isProcessed($umrn, $status){
        $mandate = Mandate::where('umrn',$umrn)->first(['id','status']);
        if (!isset($mandate->id)){
            return $status == "REJECTED" || !isset($mandate->id);
        }
        return (isset($mandate->id) && strtolower($mandate->status) == strtolower($status)) ? false : true;
    }

    public function getApplicationID($loan_application_no){
        $mandate = ProFormaInvoice::where('loan_application_no',$loan_application_no)->first(['application_id']);
        return isset($mandate->application_id) ? $mandate->application_id : 0;
    }

    public function mismatchedMandate($item, ConsumerApplicationController $consumerApplication){
        //send mismatched payments to slack
        $data = [
            'mandate_date' => $item[0],
            'debit_amount_upto_max_amount' => $item[9],
            'loan_application_no' => $item[11],
            'frequency' => ($item[13] == 'MNTH') ? 0 : 1,
            'mobile_number' => $item[19],
            'umrn' => $item[21],
            'mandate_status' => isset($this->mandateStatus[$item[13]]) ? $this->mandateStatus[$item[13]] : $this->mandateStatus['REJECTED'],
            'rejection_code' => $item[14],
            'rejection_reason' => $item[15],
            'initial_reject_reason' => $item[16]
        ];

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