<?php

namespace App\Http\Controllers\Admin;

use App\ApprovedPincodeLists;
use App\Http\Controllers\Controller;
use App\Http\Requests\AddPincodeRequest;
use App\Pincode;
use App\StateModel;
use Carbon\Carbon;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Events\V1\EventPincodeImport;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\Input;
use App\Imports\TestImport;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
//use Illuminate\Support\Facades\Session;
use App\Slack;

class PincodeController extends Controller
{

    public function getPincodes(){

        $totalcount = Pincode::count();
        $pincodes = Pincode::paginate(20);
        return view('admin/pincodes/index',['pincodes'=>$pincodes,'totalcount'=>$totalcount]);

    }

    public function getApprovePincodes(){
        $totalcount = ApprovedPincodeLists::count();
        $pincodes = ApprovedPincodeLists::orderBy('id', 'DESC')->paginate(20);
        return view('admin/approve-pincode/index',['pincodes'=>$pincodes,'totalcount'=>$totalcount]);

    }

    public function find(Request $request)
    {
        $term = trim($request->q);
        $state = $request->has("state") ? $request->get('state') : '';
        $city = $request->has("city") ? $request->get('city') : '';

        if (empty($term)) {
            return \Response::json(['anupam']);
        }

        $search_query = Pincode::where('pincode','like','%' . $term . '%');

        $city_search = function ($query) use ($city){
            $query->where('districtname', 'like', '%' . $city . '%')
                ->orWhere('taluk', 'like', '%' . $city . '%');
        };

        if(isset($state) && $state !== '' && isset($city) && $city !== ''){
            $search_query->where('state', 'like', '%' . $state . '%')->where($city_search);
        } else if(isset($state) && $state !== ''){
            $search_query->where('state', 'like', '%' . $state . '%');
        } else if(isset($city) && $city !== ''){
            $search_query->where($city_search);
        }

        $pincodes = $search_query->get();
        $pincodeArray = [];
        $formatted_tags = [];

        foreach ($pincodes as $pincode) {
            if(!in_array($pincode->pincode, $pincodeArray)) {
                $formatted_tags[] = ['id' => $pincode->pincode, 'text' => $pincode->pincode];
                $pincodeArray[] = $pincode->pincode;
            }
        }

        return \Response::json($formatted_tags);
    }

    public function addPincode(Request $request){

        //get request to addPincode method without the key is a get request which will only return the state list
        $data['state_list'] = StateModel::get(['name','code','id']);

        //If the request has key pincode means it is a post(insert) request
        if($request->has('pincode')) {

            $validate = [
                'pincode' => 'required|digits:6|unique:pincodes',
                'state' => 'required'
            ];
            $request->validate($validate);
//          $validator->withInput();

            /*if ($validator->fails()) // on validator found any error
            {
                // pass validator object in withErrors method & also withInput it should be null by default
                return redirect('admin/pincodes/add')->withErrors($validator)->withInput();
            }*/

            $pincode = new Pincode();
            $pincode->created_at = Carbon::now()->toDateTimeString();
            //$lender->created_by = Auth::user()->id;
            $pincode->pincode = $request->get('pincode');
            $pincode->state = $request->get('state');
            $pincode->taluk = $request->get('taluka');
            $pincode->districtname = $request->get('district');

            $pincode->save();
            \Session::flash('success', 'Pincode successfully added');
            return redirect()->back();
        }
        return view('admin/pincodes/add', $data);

    }

    public function getEditPincode($id)
    {
        $data['state_list'] = StateModel::get(['name', 'code', 'id']);
        $data['pincode'] = Pincode::where('id', $id)->first();

        return view('admin/pincodes/add', $data);
    }


    public function editPostPincode(Request $request , $id){

        $validate = [
            'pincode' => 'required|digits:6',
            'state' => 'required'
        ];
        $request->validate($validate);

        $validate = \DB::table("pincodes")->where('id','!=',$id)->where('pincode','=',$request->get('pincode'))->first();
        if(!isset($validate->id)){
            $pincode = Pincode::find($id);
            $pincode->updated_at = Carbon::now()->toDateTimeString();
            //$lender->created_by = Auth::user()->id;
            $pincode->pincode = $request->get('pincode');
            $pincode->state = $request->get('state');
            $pincode->taluk = $request->get('taluka');
            $pincode->districtname = $request->get('district');

            $pincode->save();
            \Session::flash('success', 'Pincode successfully updated');
            return redirect('admin/pincodes');
        }else{
            return redirect()->back()->withErrors(['This Pincode Already Exists']);
        }
    }

    public function importPincode(Request $request){
        try {
            if ($request->has('file')) {
        
                if($request->files->get('file') != null) {
                    if(filesize($request->files->get('file')) > 18874368){
                    Session::flash('error', 'Uploaded file is too large');
                    return redirect()->back();
                    }
                }
                
            }
            $path = Storage::disk('s3')->put("cron_pincode/".time().'.xlsx', $request->file('file'));
            $id = Auth::user()->id;
            $email = Auth::user()->email;
            event(new EventPincodeImport($path, $id, $email));

            Session::flash('success', 'You we\'ll notify once pincode uploaded');
            return redirect()->back();
        }catch (\Exception $e){
            Session::flash('error', 'Exception occurred while importing pincode');
            return redirect()->back();
        }
    }

    public static function importFromExcel($file_path, $user_id, $email){
        try {
            $collection = Excel::toCollection(new TestImport(new Request(['from' => __FUNCTION__])), $file_path, 's3');
            $approved_pincodes = new ApprovedPincodeLists();
            if(count($collection) > 0)
            {
                ApprovedPincodeLists::whereNull('deleted_at')->update(['deleted_at' => Carbon::now()->toDateTimeString()]);
                $time = Carbon::now()->toDateTimeString();
                $pincodeData = [];
                foreach($collection[0] as $key => $item) {
                    if($key > 0) {
    //                    $pincodeExist = $approved_pincodes->where('pin_codes', $item[1])->first();
    //                    if(!$pincodeExist)
    //                    {
                            $pincodeData[] = [
                                'pin_codes' => $item[1],
                                'agency_name' => $item[2],
                                'user_id' => $user_id,
                                'created_at' => $time,
                                'updated_at' => $time
                            ];
    //                    }
                    }
                }

                if(isset($pincodeData)) {
                    foreach(array_chunk($pincodeData,2000) as $pincodeDatas){
                        ApprovedPincodeLists::insert($pincodeDatas);
                    }
                }

                if(isset($file_path))
                {
                    //Storage::delete($file_path);
                    self::sendNotification($email);
                    return "Pincode Import Successfully";
                }
            }
            return "Something went wrong";
        }
        catch (\Exception $e){
            if (str_contains($e->getmessage(), "Column 'pin_codes' cannot be null")){
                (new Slack(new Request(['title' => 'Approved Pincodes File Update', 'fields' => ['Status' => 'Failed', 'Reason' => 'Pincode column has null value'], 'group' => 'payment_collection'])))->send();
            } elseif (str_contains($e->getmessage(), "Incorrect integer value")) {
                (new Slack(new Request(['title' => 'Approved Pincodes File Update', 'fields' => ['Status' => 'Failed', 'Reason' => 'Space found in pincode data'], 'group' => 'payment_collection'])))->send();
            } else {
                (new Slack(new Request(['title' => 'Approved Pincodes File Update', 'fields' => ['Status' => 'Failed', 'Reason' => 'Some error occurred'], 'group' => 'payment_collection'])))->send();
            }
        }
    }

    private static function sendNotification($email)
    {
        Mail::send('emails.reminders.basic_reminder', [
            'body' => "Pincode Imported Successfully"
        ], function ($message) use ($email) {
            $message->to($email)
                ->subject('Pincode Imported Successfully');
                // ->cc('ops@creditfair.in');
        });
    }
}
