<?php
/**
 * Created by PhpStorm.
 * User => sunilkhorwal
 * Date => 2019-05-30
 * Time => 15 =>57
 */

namespace App\Avanse\DataModels;

use App\AvanseCreateCustomer;
use App\AvanseCreateFinance;
use App\AvanseDisbursement;
use App\AvanseDisbursementStatus;
use App\ConsumerApplication;
use App\ConsumerApplicationElement;
use App\ConsumerApplicationFiles;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\Admin\ConsumerDocument;
use App\Http\Controllers\Admin\DisbursementController;
use App\MultiStageDisbursement;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Slack;
use Illuminate\Support\Facades\Storage;
use App\ApplicationEMICalculation;
use App\CreditReport;
use Illuminate\Support\Facades\Mail;

class AvanseStatement
{

    public $error = null;
    private $request;
    public $service = null;

    public function __construct(Request $request)
    {

        $this->request = $request;
    }

    public function getPayload()
    {

        if ($this->service) {
            $service = $this->service;
            return $this->$service();
        }

        if (!$this->dataInitialize()){
            return false;
        }

        return [
            "finReference" => $this->request->get('fin_reference_id'),
            "type" => $this->request->get('type')
        ];
    }

    private function dataInitialize(){

        $avanseFinance = AvanseCreateFinance::where('application_id', $this->request->get('id'))->first(['id', 'finReference']);
        if (!isset($avanseFinance->id)){
            $this->error[] = 'Please create loan for avanse before creating disbursement instruction';
            return false;
        }


        return $this->request->merge([
            'fin_reference_id' => $avanseFinance->finReference,
            'type' => 'NOC'
        ]);
    }

    public function saveResponse(AvanseStatement $avanseStatement, $response){
        if ($response){
            try {
                if (!isset($response->returnStatus->returnCode) || $response->returnStatus->returnCode != '0000'){
                    $avanseStatement->error = isset($response->returnStatus->returnText) ? $response->returnStatus->returnText : 'Avanse: Incomplete data found!';
                    return false;
                }

                if (isset($response->docContent) && $response->docContent){
                    if($this->request->get('type') == "NOC"){
                        (new ConsumerDocument($this->request))->uploadToS3($this->request->get('type'), $this->request->get('id'), base64_decode($response->docContent), '.pdf');
                    }else{
                        (new ConsumerDocument($this->request))->uploadToS3($this->request->get('type'), $this->request->get('id'), file_get_contents($response->docContent), '.pdf');
                    }
                    return $this->request->get('fin_reference_id');
                }

            }catch (\Exception $exception){
                (new Slack(new Request(['title' => 'Request Error', 'fields' => ['response' => $response, 'request' => json_encode($this->request->all())]])))->send();
                return false;
            }
        }

        return $response;
    }

}
