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

namespace App\Imports;

use App\ConsumerApplication;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Invoices;
use App\Lenders;
use App\Mandate;
use App\PaymentEmi;
use App\PaymentTransaction;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\App;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\ToCollection;

class InvoiceImport implements ToCollection
{

    use Importable;
    private $request;

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

    /**
     * @param Collection $collection
     */
    public function collection(Collection $collection)
    {
        $data = $collection;

        unset($data[0]);

        $subventions = [];
        $processing_fees = [];
        $isProcessingFee = false;
        foreach ($data as $item){
            if ($item[0] == 'id') {
                $isProcessingFee = true;
            }


            $gst = [];
            if ($item[7])
                $gst[] = ['taxes' => 'IGST', 'tax_type' => 18,'gst_amount' => round($item[7],2),'net_amount' => round($item[5],2)];
            if ($item[8])
                $gst[] = ['taxes' => 'CGST', 'tax_type' => 9,'gst_amount' => round($item[8],2),'net_amount' => round($item[5],2)];
            if ($item[9])
                $gst[] = ['taxes' => 'SGST', 'tax_type' => 9,'gst_amount' => round($item[9],2),'net_amount' => round($item[5],2)];


            if (!$isProcessingFee && $item[0] != null){

                $subventions[$item[2]][] = [
                    'id' => $item[0],
                    'name' => $item[1],
                    'merchant_name' => $item[2],
                    'state' => $item[3],
                    'disbursed_date' => Carbon::parse($item[4])->toDateTimeString(),
                    'subvention_amount' => $item[5] + $item[6],
                    'subvention_gst' => $item[6],
                    'subvention_igst' => $item[7],
                    'subvention_cgst' => $item[8],
                    'subvention_sgst' => $item[9],
                    'merchant_gst_number' => $item[10],
                    'invoice_number' => $item[11],
                    'getGSTDetailsSubvention' => $gst,
                    'invoice_type' => 'subvention_invoice'
                ];
            }else{
                if ($item[0] != 'id' && $item[0] != null) {
                    /*$processing_fees[] = [
                        'id' => $item[0],
                        'name' => $item[1],
                        'merchant_name' => $item[2],
                        'state' => $item[3],
                        'disbursed_date' => $item[4],
                        'processing_fee' => $item[5],
                        'taxable_amount' => $item[6],
                        'gst_amount' => $item[7],
                        'processing_igst' => $item[8],
                        'processing_cgst' => $item[9],
                        'processing_sgst' => $item[10],
                        'invoice_number' => $item[11],
                        'getGSTDetails' => $gst,
                        'invoice_type' => 'processing_invoice'
                    ];*/
                }
            }
        }


        //$application = (new ConsumerApplicationController());
        foreach ($subventions as $merchant_name => $subvention) {

            $invoices = [];
            foreach ($subvention as $invoice){
                $invoices[] = $this->sendMail($invoice);
                break;
            }
            break;
            $this->request->get('event')->comment($merchant_name.' Total'. count($invoices));
            //$this->sendInvoice($invoices, $merchant_name);
            //$request = $application->invokeCommunication($subvention['id'], $subvention);
            //$request = $application->sendWelcomeLetter($processing_fee['id'], $processing_fee);
            //$this->processingFeeInvoice($request, $processing_fee);
            //$this->savePDF($request, $subvention);
        }

    }

    public function sendMail($data){
        $this->updateInvoice($data);
        //return $this->makeInvoice($data);
    }

    public function updateInvoice($data){
        $invoice =  [
            'invoice_id' => $data['invoice_number'],
            'amount' => round($data['subvention_amount']),
            'net_amount' => round($data['subvention_gst'],2),
            'igst' => round($data['subvention_igst'],2),
            'cgst' => round($data['subvention_cgst'],2),
            'sgst' => round($data['subvention_sgst'],2)
        ];
        $d = Invoices::where('application_id', $data['id'])->where('type',$data['invoice_type'])->first(['id']);
        if (isset($d->id)){
            $s = Invoices::where('id', $d->id)->update($invoice);
        }
        return $s;
    }

    public function makeInvoice($data){
        $pdf = App::make('snappy.pdf.wrapper');
        $application = ConsumerApplication::with('lender','application_element','proFormaInvoice','merchant')->where('id',$data['id'])->first();
        $data['lender'] = $application->lender;
        $data['user']['customer_name'] = $application->name;
        $data['user']['center_name'] = isset($application->application_element->merchant_center->name) ? $application->application_element->merchant_center->name : '';
        $data['user']['center_address'] = isset($application->application_element->merchant_center->location) ? $application->application_element->merchant_center->location : '';
        $data['user']['center_gst_number'] = isset($application->application_element->merchant_center->gst_number) ? $application->application_element->merchant_center->gst_number : '';
        $data['user']['merchant_name'] = isset($application->merchant->merchant_name) ? $application->merchant->merchant_name :  $application->src_merchant_name;
        $data['user']['merchant_address'] = isset($application->merchant->address) ? ucwords(strtolower($application->merchant->address)) : '';
        $data['user']['merchant_gst_number'] =  isset($application->proFormaInvoice->gst_number) ? $application->proFormaInvoice->gst_number : '';
        $data['user']['proFormaInvoice'] = $application->proFormaInvoice;
        $invoice = $pdf->loadView('admin.documents._subvention_fee_invoice', $data)->setOption('encoding', 'UTF-8')->setPaper('a4')->setOrientation('portrait');
        return ['invoice' => $invoice, 'merchant' => $application->merchant];
    }

    public function sendInvoice($invoices, $merchant_name){
        $body = "Dear ".$merchant_name." <br/><br/>Please find attached the revised GST invoices for 1st April to 31th June<br/>
Let us know if you have any questions";
        $emails = [];
        if ($invoices[0]['merchant']) {
            $emails = explode(',',$invoices[0]['merchant']->email);
        }
        if ($emails) {
            $this->request->get('event')->comment($merchant_name.' Email send');
            \Mail::send('emails.reminders.basic_reminder', [
                'body' => $body,
            ], function ($message) use ($invoices, $emails) {
                $message->to($emails)->subject('Revised invoices for 1st April to 31th June');
                $message->cc('bd@creditfair.in');
                foreach ($invoices as $invoice) {
                    $message->attachData($invoice['invoice']->output(), 'Revised Invoice.pdf');
                }
            });
        }else{
            $this->request->get('event')->comment($merchant_name.' No Mail');
        }
    }

    public function processingFeeInvoice(Request $request, $processing_fee){
        if($request->get('processing_fee_invoice')) {
            $pdf = App::make('snappy.pdf.wrapper');
            $loan_agreement = $pdf->loadView('admin.documents.processing_fee_invoice', $request->get('processing_fee_invoice_attributes'))->setOption('encoding', 'UTF-8')->setPaper('a4')->setOrientation('portrait');
            $loan_agreement->save(storage_path().'/'.$processing_fee['name'].'-'.$processing_fee['invoice_number'].'.pdf');
        }
    }

    public function savePDF($request, $subvention){
        $id = $subvention['id'];
        if($request->get('txt')) {
            $application = ConsumerApplication::find($id);

            $lender = Lenders::where('id', $application->lender_id)->first();
            $pdf = App::make('snappy.pdf.wrapper');
            $pdf->loadHTML($request->get('txt'))->setOption('encoding', 'UTF-8')->setPaper('a4')->setOrientation('portrait');
            if ($request->get('type') == 'Loan Agreement') {
                $pdf->setOption("footer-right", "Page [page] from [topage]");
                $pdf->setOption('footer-font-size', 10);
                $pdf->setOption('margin-bottom', 30);
            }
            $loan_agreement = $pdf->setOption('footer-html', view('admin.editor.footer', ['type' => $request->get('type'), 'lender' => $lender])->render());
            $loan_agreement->save(storage_path().'/'.$subvention['name'].'-'.$subvention['invoice_number'].'.pdf');
        }
    }
}