<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use App\Models\Branch;
use App\Models\Transfer;
use App\Models\Product;
use App\Models\Inventory;
use App\Models\Carmodel;
use App\Models\Carvarient;
use App\Http\Requests\TransferRequest;
use App\Http\Requests\TransferAcceptRequest;
use Auth, DB, Mail, Validator, File, DataTables;

class TransferController extends Controller{
    /** construct */
        public function __construct(){
            $this->middleware('permission:transfer-create', ['only' => ['create']]);
            $this->middleware('permission:transfer-edit', ['only' => ['edit']]);
            $this->middleware('permission:transfer-view', ['only' => ['view']]);
            $this->middleware('permission:transfer-delete', ['only' => ['delete']]);
        }
    /** construct */

    /** index */
        public function index(Request $request){
            if($request->ajax()){
                $collection = DB::table('transfer as t')
                                ->select('t.id', 't.to_branch as to_branch_id', 't.from_branch as from_branch_id', 'tb.name as to_branch', 'fb.name as from_branch', 'p.name as product', 't.status','cm.name as cm_name','cv.name as cv_name','i.vin_number as vin_number')
                                ->leftjoin('branches as tb', 'tb.id', 't.to_branch')
                                ->leftjoin('branches as fb', 'fb.id', 't.from_branch')
                                ->leftjoin('inventory as i', 'i.id', 't.inventory_id')
                                ->leftjoin('products as p', 'p.id', 'i.name')
                                ->leftjoin('car_model as cm', 'cm.id', 'p.car_model')
                                ->leftjoin('car_varient as cv', 'cv.id', 'p.veriant');
                    
                // if(auth()->user()->roles->pluck('name')[0] != 'admin')
                //     $collection->where(['t.to_branch' => auth()->user()->branch]);
                
                $data = $collection->get();
                 
                return Datatables::of($data)
                        ->addIndexColumn()
                        ->addColumn('action', function($data){
                            $return = '';
                                
  $userBranchArray = explode(',',auth()->user()->branch);
                            if (auth()->user()->can('transfer-delete') && $data->status == 'pending') {
                             
                          
                                if(in_array($data->from_branch_id, $userBranchArray)){
                                    $return = '<div class="btn-group">';
                                    $return .= '<a href="javascript:;" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
                                                    <i class="fa fa-bars"></i>
                                                </a> &nbsp;
                                                <ul class="dropdown-menu">
                                                    <li><a class="dropdown-item" href="'.route('transfer.accept.check', ['id' => base64_encode($data->id)]).'">Accept</a></li>
                                                    <li><button type="button" class="dropdown-item" data-toggle="modal" data-target="#model_reject_'.$data->id.'">Reject</button></li>
                                                </ul>';
                                    $return .= '</div>';
                                }else{
                                    $return =   '<a class="btn btn-default btn-xs" href="javascript:;" onclick="change_status(this);" data-status="delete" data-id="'.base64_encode($data->id).'"><i class="fa fa-trash"></i></a>';
                                }
                            }
                            
                             if (auth()->user()->can('transfer-delete') && $data->status == 'accepted') {
                             
                          
                                if(in_array($data->to_branch_id, $userBranchArray)){
                                    $return = '<div class="btn-group">';
                                    $return .= '<a href="javascript:;" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
                                                    <i class="fa fa-bars"></i>
                                                </a> &nbsp;
                                                <ul class="dropdown-menu">

                                                    <li><button type="button" class="dropdown-item" data-toggle="modal" data-target="#model_received_'.$data->id.'">Received</button></li>
                                                </ul>';
                                    $return .= '</div>';
                                }
                            }

                            if($data->status == 'accepted'){
                                if(in_array($data->to_branch_id, $userBranchArray)){
                                    $return .=  '<a href="'.route('transfer.gate.pass', ['id' => base64_encode($data->id)]).'" class="btn btn-default btn-xs">
                                                    <i class="fa fa-eye"></i>
                                                </a>';
                                }else{
                                    $return .=  '<a href="'.route('transfer.transfer.details', ['id' => base64_encode($data->id)]).'" class="btn btn-default btn-xs">
                                                    <i class="fa fa-eye"></i>
                                                </a>';
                                }
                            }

                            $return .= '<div class="modal fade" id="model_reject_'.$data->id.'" tabindex="-1" role="dialog" aria-labelledby="model_reject_'.$data->id.'" aria-hidden="true">
                                            <div class="modal-dialog" role="document">
                                                <div class="modal-content">
                                                    <div class="modal-header">
                                                        <h5 class="modal-title" id="model_reject_'.$data->id.'">Reject</h5>
                                                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                                            <span aria-hidden="true">&times;</span>
                                                        </button>
                                                    </div>
                                                    <form class="transfer_reject" method="post" action="'.route('transfer.reject').'">
                                                        <div class="modal-body">
                                                            <input type="hidden" name="id" value="'.$data->id.'" />

                                                            <div class="row">
                                                                <div class="form-group col-sm-6">
                                                                    <label for="from_branch">From Branch</label>
                                                                    <input type="text" class="form-control" placeholder="Plese enter from branch" value="'.$data->from_branch.'" readonly>
                                                                </div>
                                                                <div class="form-group col-sm-6">
                                                                    <label for="to_branch">To Branch</label>
                                                                    <input type="text" class="form-control" placeholder="Plese enter from branch" value="'.$data->to_branch.'" readonly>
                                                                </div>
                                                                <div class="form-group col-sm-12">
                                                                    <label for="reason'.$data->id.'">To Branch</label>
                                                                    <textarea id="reason_'.$data->id.'" name="reason" class="form-control" rows="3" cols="30" required></textarea>
                                                                </div>
                                                            </div>
                                                        </div>
                                                        <div class="modal-footer">
                                                            <button type="submit" class="btn btn-primary">Save</button>
                                                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                                                        </div>
                                                    </form>
                                                </div>
                                            </div>
                                        </div>';
                                        
                                        
                                        $return .= '<div class="modal fade" id="model_received_'.$data->id.'" tabindex="-1" role="dialog" aria-labelledby="model_received_'.$data->id.'" aria-hidden="true">
                                            <div class="modal-dialog" role="document">
                                                <div class="modal-content">
                                                    <div class="modal-header">
                                                        <h5 class="modal-title" id="model_received_'.$data->id.'">Received</h5>
                                                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                                            <span aria-hidden="true">&times;</span>
                                                        </button>
                                                    </div>
                                                    <form class="transfer_received" method="post" action="'.route('transfer.received').'">
                                                        <div class="modal-body">
                                                            <input type="hidden" name="id" value="'.$data->id.'" />

                                                            <div class="row">
                                                                <div class="form-group col-sm-6">
                                                                    <label for="from_branch">From Branch</label>
                                                                    <input type="text" class="form-control" placeholder="Plese enter from branch" value="'.$data->from_branch.'" readonly>
                                                                </div>
                                                                <div class="form-group col-sm-6">
                                                                    <label for="to_branch">To Branch</label>
                                                                    <input type="text" class="form-control" placeholder="Plese enter from branch" value="'.$data->to_branch.'" readonly>
                                                                </div>
                                                                <div class="form-group col-sm-12">
                                                                    <label for="reason'.$data->id.'">To Branch</label>
                                                                    <textarea id="reason_'.$data->id.'" name="reason" class="form-control" rows="3" cols="30" required></textarea>
                                                                </div>
                                                            </div>
                                                        </div>
                                                        <div class="modal-footer">
                                                            <button type="submit" class="btn btn-primary">Save</button>
                                                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                                                        </div>
                                                    </form>
                                                </div>
                                            </div>
                                        </div>';

                            return $return;
                        })

                        ->editColumn('status', function ($data) {
                            if ($data->status == 'rejected') {
                                return '<span class="badge badge-pill badge-danger">Rejected</span>';
                            } else if ($data->status == 'accepted') {
                                return '<span class="badge badge-pill badge-success">Accepted</span>';
                            }  else if ($data->status == 'received') {
                                return '<span class="badge badge-pill badge-success">Received</span>';
                            }else {
                                return '<span class="badge badge-pill badge-info">Pending</span>';
                            }
                        })

                        ->rawColumns(['action', 'status'])
                        ->make(true);
            }
            
            return view('transfer.index');
        }
    /** index */

    /** create */
        public function create(Request $request){
            $products = Product::select('id', 'name', 'veriant')->get();

            /*$collection = Branch::where(['status' => 'active']);
            
            if(auth()->user()->roles->pluck('name')[0] != 'admin')
                $collection->where('id', '!=', auth()->user()->branch);

            $branches = $collection->get();*/

            //branch selection
            $branch = Branch::select('*');
            if(!empty(auth()->user()->branch) && auth()->user()->branch != '' && auth()->user()->branch != NULL){
                $branch_arr = explode(',', auth()->user()->branch);
                if(!empty($branch_arr)){
                    $branch = $branch;    
                }
            }                        
            $branch = $branch->where(['status' => 'active'])->get(); 
            //branch selection
            $carmodel = Carmodel::where(['status' => 'active'])->get();
            $carvarient = Carvarient::where(['status' => 'active'])->get();

            return view('transfer.create')->with(['branches' => $branch, 'products' => $products,'carmodel'=>$carmodel,'carvarient'=>$carvarient]);
        }
    /** create */

    /** insert */
        public function insert(TransferRequest $request){
            if($request->ajax()){ return true; }
            
            $from_branch = auth()->user()->branch;
            if(auth()->user()->roles->pluck('name')[0] == 'admin')
                $from_branch = $request->from_branch;

            $data = [
                'to_branch' => $request->to_branch,
                // 'product_id' => $request->product_id,
                'from_branch' => $from_branch,
                'inventory_id'=>$request->vin_number,
                'status' => 'pending',
                'created_at' => date('Y-m-d H:i:s'),
                'created_by' => auth()->user()->id,
                'updated_at' => date('Y-m-d H:i:s'),
                'updated_by' => auth()->user()->id
            ];

            $transfer = Transfer::create($data);

            if($transfer){
                return redirect()->route('transfer')->with('success', 'Record inserted successfully');
            }else{
                return redirect()->back()->with('error', 'Failed to insert record')->withInput();
            }
        }
    /** insert */

    /** reject */
        public function reject(Request $request){
            if (!$request->ajax()) { exit('No direct script access allowed'); }

            if (!empty($request->all())) {
                $data = Transfer::where(['id' => $request->id])->first();

                if(!empty($data)){
                    $process = Transfer::where(['id' => $request->id])->update(['status' => 'rejected', 'reason' => $request->reason, 'updated_by' => auth()->user()->id]);

                    if($process)
                        return response()->json(['code' => 200]);
                    else
                        return response()->json(['code' => 201]);
                } else {
                    return response()->json(['code' => 201]);
                }
            } else {
                return response()->json(['code' => 201]);
            }
        }
    /** reject */

    /** accept-check */
        public function accept_check(Request $request, $id = ''){
           
            if (isset($id) && $id != '' && $id != null)
                $id = base64_decode($id);
            else
                return redirect()->route('transfer')->with('error', 'Something went wrong');
            
            $transfer = Transfer::select('from_branch', 'to_branch', 'product_id','inventory_id')->where(['id' => $id])->first();
            if(!$transfer){
                return redirect()->back()->with(['error' => 'Record not found']);
            }

            // $product = Product::select('id', 'name', 'veriant')->where(['id' => $transfer->product_id])->first();
            // if(!$product){
            //     return redirect()->back()->with(['error' => 'Product not found']);
            // }
            
            $inventories = Inventory::where('id','=',$transfer->inventory_id)->get();
         
            return view('transfer.accept')->with(['id' => $id, 'inventories' => $inventories]);
        }
    /** accept-check */

    /** inventory-details */
        public function inventory_details(Request $request, $id = ''){
            $data = DB::table('inventory as i')
            ->select('cm.name as cm_name', 'cv.name as cv_name', 'i.key_number', 'i.engine_number', 'i.vin_number', 'i.ex_showroom_price', 
                                        'int.name as int_name', 'ext.name as ext_name', 'i.status')
                                        ->leftjoin('products as p','p.id','=','i.name')
                                        ->leftJoin('car_model as cm','cm.id','=','p.car_model')
                                        ->leftJoin('car_varient as cv','cv.id','=','p.veriant')
                                        ->leftJoin('exteriorcolor as ext','ext.id','=','p.exterior_color')
                                        ->leftJoin('interiorcolor as int','int.id','=','p.interior_color')
                                        ->where(['i.id' => $request->id])
                                        ->first();

            if($data)
                return response()->json(['code' => 200, 'data' => $data]);
            else
                return response()->json(['code' => 201]);

        }
    /** inventory-details */

    /** accept */
        public function accept(TransferAcceptRequest $request){
            if($request->ajax()){ return true; }

            DB::beginTransaction();
            try {
               $transfer = Transfer::where(['id' => $request->id])->update([ 'driver_name'=>$request->driver_name,'driver_pan'=>$request->driver_pan,'driver_lic'=>$request->driver_lic,'toolkit'=>$request->tool_kit,'medikit'=>$request->health_kit,'spare_bulb'=>$request->spare_bulb,'hazard_trinagle'=>$request->harzard_triangle,'good_condtiton'=>$request->good_condition,'status' => 'accepted', 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => auth()->user()->id]);
                  
                if(!$transfer){
                    DB::rollback();
                    return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();    
                }

                $inventory = Inventory::where(['id' => $request->product])->update(['status' => 'pdi_hold', 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => auth()->user()->id]);

                if(!$inventory){
                    DB::rollback();
                    return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();    
                }

                DB::commit();
                return redirect()->route('transfer')->with(['success' => 'Transfer accepted']);
            }catch (\Throwable $th){
                DB::rollback();
                return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();
            }
        }
    /** accept */

    /** gate-pass */
        public function gate_pass(Request $request, $id = ''){
            if (isset($id) && $id != '' && $id != null)
                $id = base64_decode($id);
            else
                return redirect()->route('transfer')->with('error', 'Something went wrong');

            $data = DB::table('transfer as t')
                        ->select('t.id', 't.transfer_fee', 'fb.name as from_branch', 'tb.name as to_branch', 'i.name', 'i.veriant', 
                                'i.key_number', 'i.engine_number', 'i.chassis_number', 'i.vin_number', 'i.ex_showroom_price',
                                'i.interior_color', 'i.exterior_color')
                        ->leftjoin('branches as fb', 'fb.id', 't.from_branch')
                        ->leftjoin('branches as tb', 'tb.id', 't.to_branch')
                        ->leftjoin('inventory as i', 'i.id', 't.inventory_id')
                        ->where(['t.id' => $id])
                        ->first();

            return view('transfer.gate_pass')->with(['data' => $data]);
        }
    /** gate-pass */

    /** transfer-details */
        public function transfer_details1(Request $request, $id = ''){
            
            if (isset($id) && $id != '' && $id != null)
                $id = base64_decode($id);
            else
                return redirect()->route('transfer')->with('error', 'Something went wrong');

            $data = DB::table('transfer as t')
                        ->select('t.id', 't.transfer_fee', 'fb.name as from_branch', 'tb.name as to_branch', 'cm.name as cm_name', 'cv.name as cv_name', 
                                'i.key_number', 'i.engine_number', 'i.chassis_number', 'i.vin_number', 'i.ex_showroom_price',
                                'int.name', 'ext.name','t.driver_name as driver_name','t.driver_lic as lic', 't.driver_pan as pan','t.toolkit as toolkit','t.medikit as medikit','t.good_condtiton as good_condtiton','t.spare_bulb as spare_bulb','t.hazard_trinagle as hazard_trinagle')
                        ->leftjoin('branches as fb', 'fb.id', 't.from_branch')
                        ->leftjoin('branches as tb', 'tb.id', 't.to_branch')
                        ->leftjoin('inventory as i', 'i.id', 't.inventory_id')
                        ->leftjoin('inventory as i', 'i.id', 't.inventory_id')
                        ->leftjoin('products as p','p.id','=','i.name')
                        ->leftJoin('car_model as cm','cm.id','=','p.car_model')
                        ->leftJoin('car_varient as cv','cv.id','=','p.veriant')
                        ->leftJoin('exteriorcolor as ext','ext.id','=','p.exterior_color')
                        ->leftJoin('interiorcolor as int','int.id','=','p.interior_color')
                        ->where(['t.id' => $id])
                        ->first();
    
            return view('transfer.transfer_details')->with(['data' => $data]);
        }
    /** transfer-details */

    /** change-status */
        public function change_status(Request $request){
            if (!$request->ajax()) { exit('No direct script access allowed'); }
            $id = base64_decode($request->id);
            
            $data = Transfer::where(['id' => $id])->first();

            if (!empty($data)) {
                $update = Transfer::where(['id' => $id])->delete();
                if ($update) {
                    return response()->json(['code' => 200]);
                } else {
                    return response()->json(['code' => 201]);
                }
            } else {
                return response()->json(['code' => 201]);
            }
        
        }
    /** change-status */

    /** car varient as per car model*/
    public function varientaspercarmodel(Request $request)
    {
        $model = $request->car_model;

        $query = Carmodel::select('car_varient.id','car_varient.name')->leftjoin('car_varient','car_varient.car_model','=','car_model.id')->where('car_varient.car_model',$model)->get();

        return view('transfer.car_varient_list')->with(['query'=>$query]);
    }
    /** car varient as per car model*/ 

    /** VIN Number as per car varient */
    public function vinaspercarvarient(Request $request)
    {
        $car_varient = $request->car_varient;
        //dd($car_varient);
        $query = Inventory::select('inventory.id','inventory.vin_number')->leftjoin('products', 'products.id', 'inventory.name')->where('products.veriant',$car_varient)->get();
        //dd($query);
        return view('transfer.vin_car_varient_list')->with(['query'=>$query]);
    }
    /** VIN Number as per car varient */
    
    public function received(Request $request)
    {
        
         if (!$request->ajax()) { exit('No direct script access allowed'); }
            
          DB::beginTransaction();
            try {
                $transfer = Transfer::where(['id' => $request->id])->update(['status' => 'received','remarks'=>$request->reason, 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => auth()->user()->id]);
                
                if(!$transfer){
                    DB::rollback();
                    return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();    
                }

                $transfer = Transfer::where(['id' => $request->id])->first();
           
                $inventory = Inventory::where(['id' => $transfer->inventory_id])->update(['branch_id'=>auth()->user()->branch,'status' => 'active', 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => auth()->user()->id]);
                           
                if(!$inventory){
                    DB::rollback();
                    return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();    
                }
                
                DB::commit();
                 return response()->json(['code' => 200]);
            }catch (\Throwable $th){
                DB::rollback();
                return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();
            }
    }
    
}
