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

namespace App\Avanse\DataModels;

use App\AvanseCreateCustomer;
use App\AvanseCreateDocument;
use App\AvanseCreateFinance;
use App\AvanseDisbursement;
use App\ConsumerApplication;
use App\ConsumerApplicationFiles;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Slack;
use Illuminate\Support\Facades\Storage;

class AvanseAddDocument
{

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

    public function __construct(Request $request)
    {

        $this->request = $request;
    }

    public function getPayload()
    {

        if($this->request->get('files')) {
            $documents = $this->request->get('files');
        }else{
            $documents = ConsumerApplicationFiles::where('consumer_application_id', $this->request->get('id'))->where('id', $this->request->get('consumer_application_file_id'))->get();
            $s3 = Storage::disk('s3');
        }
        $documentsLists = [];
        $avanseDisbursement = AvanseCreateFinance::where('application_id', $this->request->get('id'))->first(['id', 'finReference']);

        if(!$avanseDisbursement || !$avanseDisbursement->finReference){
            return false;
        }

        foreach ($documents as $document){

            if(isset($document->applicant_type) && $document->applicant_type == 1){
                $application = ConsumerApplication::where('id', $this->request->get('id'))->first(['applicant_id','pan_card','co_applicant_pan_card', 'aadhaar_card', 'co_applicant_aadhaar_card']);
                $avanseCus = AvanseCreateCustomer::where('application_id', $this->request->get('id'))->where('applicant_id', $application->applicant_id)->first(['cif']);
            }else{
                $application = ConsumerApplication::where('id', $this->request->get('id'))->first(['co_applicant_id as applicant_id','pan_card','co_applicant_pan_card', 'aadhaar_card', 'co_applicant_aadhaar_card']);
                $avanseCus = AvanseCreateCustomer::where('application_id', $this->request->get('id'))->where('applicant_id', $application->applicant_id)->first(['cif']);
            }

            if (isset($s3)) {
                $getExtension = explode('.', $document->file_path);
                $ext = $getExtension[count($getExtension) - 1];
                $extension = $ext == 'pdf' ? "PDF" : ($ext == 'xlsx' || $ext == 'xls' ? 'EXCEL' : (in_array($ext, ['jpg','png','gif','webp','tiff','psd','raw','bmp','jpeg']) ? 'IMG' : strtoupper($ext)));
                $content = base64_encode($s3->get($document->file_path));
            }else{
                $document = (object) $document;
                //$mimeType = $document->file->getClientmimeType();
                $getExtension = explode('.', $document->file_path);
                $ext = $getExtension[count($getExtension) - 1];
                $extension = $ext == 'pdf' ? "PDF" : ($ext == 'xlsx' || $ext == 'xls' ? 'EXCEL' : (in_array($ext, ['jpg','png','gif','webp','tiff','psd','raw','bmp','jpeg']) ? 'IMG' : strtoupper($ext)));
                $content = base64_encode(file_get_contents($document->file));
            }

            $custDocTitle = $document->file_type == 'pan_card' ? ($this->request->get('pan_card') ? $this->request->get('pan_card') : $application->pan_card) : ($document->file_type == 'co_applicant_pan_card' ? ($this->request->get('pan_card') ? $this->request->get('pan_card') : $application->co_applicant_pan_card) : ($document->file_type == 'aadhar_card' ? ($this->request->get('aadhar_card') ? $this->request->get('aadhar_card') : $application->aadhaar_card) : ($document->file_type == 'co_applicant_aadhar_card' ? ($this->request->get('aadhar_card') ? $this->request->get('aadhar_card') : $application->co_applicant_aadhaar_card) : $document->file_type)));

            if(in_array($document->file_type, ['aadhar_card', 'co_applicant_aadhar_card'])){
                $custDocTitle = substr($custDocTitle, -4);
            }

            if($this->getService) {
                $documentsLists = [
                    "cif" => isset($avanseCus->cif) ? $avanseCus->cif : null,
                    "document" => [
                        "custDocTitle" => $custDocTitle,
                        "docCategory" => !isset($s3) ? ucwords($document->file_type) : $this->request->get('file_type'),
                        "custDocIssuedCountry" => "IN",
                        "custDocIssuedAuth" => strpos($custDocTitle, 'vkyc_video') !== false ? "HYPERVERGE" : (strpos($custDocTitle, 'pan') !== false ? 'NSDL' : ( strpos($custDocTitle, 'aadhaar') !== false ? 'UIDAI' : '')),
                        "docFormat" => $extension,
                        "custDocIssuedOn" => date('c', Carbon::now()->subYear(1)->timestamp),
                        "custDocExpDate" => "",
                        "docContent" => $content,
                        "docName" => $document->file_type . "." . $ext
                    ]
                ];
            }else{
                $documentsLists = [
                    "finReference" => $avanseDisbursement->finReference,
                    "custDocTitle" => $custDocTitle,
                    "docCategory" => !isset($s3) ? ucwords($document->file_type) : $this->request->get('file_type'),
                    "docName" => $document->file_type . "." . $ext,
                    "docFormat" => $extension,
                    "docReceived" => "true",
                    "docReceivedDate" => date('c'),
                    "docOriginal" => "true",
                    "docReturnable" => "false",
                    "docContent" => $content,
                    "docRefId" => $document->id,
                ];
            }
        }

        return $documentsLists;
    }

    public function saveResponse(AvanseAddDocument $avanseAddDocument, $response){
        if ($response){
            try {

                if (!isset($response->returnCode) || $response->returnCode != '0000'){
                    $avanseAddDocument->error = isset($response->returnText) ? $response->returnText : 'Avanse: Incomplete data found!';
                    return false;
                }

                $avanse_document_id = AvanseCreateDocument::insertGetId([
                    'application_id' => $this->request->get('id'),
                    'response' => json_encode($response),
                    'consumer_application_file_id' => $this->request->get('consumer_application_file_id'),
                    'created_at' => Carbon::now()->toDateTimeString(),
                    'returnText' => $response->returnText
                ]);

                if ($avanse_document_id) {
                    $this->request->merge(['avanse_document_id' => $avanse_document_id]);
                }
                return $response->returnText;
            }catch (\Exception $exception){
                (new Slack(new Request(['title' => 'Request Error', 'fields' => ['M' => $exception->getMessage(), 'F' => $exception->getFile(), 'L' => $exception->getLine(), 'response' => $response, 'request' => json_encode($this->request->all())]])))->send();
                return false;
            }
        }

        return $response;
    }

}
