<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\CarOwner;
use App\Models\User;
use App\Models\CarOwnerCar;
use App\Models\BodyType;
use App\Models\WashTypeToWash;
use App\Models\WashCategory;
use App\Models\WashDetail;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;
use Config;
use Hash;
use Auth;

class CoCarController extends Controller
{
    public function __construct(){
    }


    public function index(){
    }

    public function addCar(Request $request){
        $validate = Validator::make(
            $request->all(),
            [
                'car_registration_no' => 'required',
                'co_id' => 'required',
                // 'body_type_id' => 'required',
                // 'control_no' => 'required',
                // 'make' => 'required',
                // 'engine_no' => 'required',
                // 'vin' => 'required',
                // 'license_expiry_date' => 'required',
            ],
            [
                // 'body_type_id.required' => 'Please select a body type'
            ]
        );

        if($validate->fails()) {
            $errorString = implode(",", $validate->messages()->all());
            return response()->json([
                'success' => 0,
                'message' => $errorString,
            ]);
        }
        $car_registration_no = $request->input('car_registration_no');
        $co_id = $request->input('co_id');
        $body_type_id = $request->input('body_type_id');
        $control_no = $request->input('control_no');
        $make = $request->input('make');
        $keytag = $request->input('keytag');
        $engine_no = $request->input('engine_no');
        $vin = $request->input('vin');
        $license_expiry_date = $request->input('license_expiry_date');
        if($body_type_id != '') {
            $getBodyType = BodyType::where('id', $body_type_id)->select('name')->first();
            $body_type = $getBodyType->name;
        } else {
            $body_type_id = 0;
            $body_type = '';
        }
        if($license_expiry_date != '') {
            $license_expiry_date = date("Y-m-d", strtotime($license_expiry_date));
        }
        $dt = Carbon::now();

        $checkCar = CarOwnerCar::where('car_registration_no', $car_registration_no)->first();
        if(!empty($checkCar)) {
            // if($checkCar->body_type_id == 0){
            //     $checkCar->update([
            //         'body_type'=> $body_type,
            //         'body_type_id'=> $body_type_id,
            //         'updated_at'=>$dt->toDayDateTimeString()
            //         ]);    
            // }
            $checkCar->update([
                    'co_id'=> $co_id,
                    'updated_at'=>$dt->toDayDateTimeString()
                    ]);
            $car_id = $checkCar->id;
            $checkCar = CarOwnerCar::where('id', $car_id)->first();
            // return response()->json([
            //     'success' => 0,
            //     'message' => 'Car registration no already exists.'
            // ]);
        } else {
            $carData=[
                'co_id'=> $co_id,
                'car_registration_no'=> $car_registration_no,
                'body_type'=> $body_type,
                'body_type_id'=> $body_type_id,
                'control_no'=> $control_no,
                'make'=> $make,
                'keytag'=> $keytag,
                'engine_no'=> $engine_no,
                'vin'=> $vin,
                'license_expiry_date'=> $license_expiry_date,
                'created_at'=>$dt->toDayDateTimeString(),
                'updated_at'=>$dt->toDayDateTimeString(),
            ];
            $insertCar = CarOwnerCar::create($carData);
            $car_id = $insertCar->id;
            $checkCar = CarOwnerCar::where('id', $car_id)->first();
        }
        return response()->json([
                'success' => 1,
                'message' => 'Success',
                'car_id' => $car_id,
                'car_registration_no'=> $car_registration_no,
                'car_details' => $checkCar
            ]);
    }

    public function getCars(Request $request){
        $validate = Validator::make(
            $request->all(),
            [
                'co_id' => 'required',
                'per_page' => 'required',
                'total_viewed' => 'required'
            ],
            [
                // 'co_id.required' => 'Please enter car owner id'
            ]
        );
        if($validate->fails()) {
            $errorString = implode(",", $validate->messages()->all());
            return response()->json([
                'success' => 0,
                'message' => $errorString,
            ]);
        }
        $co_id = $request->input('co_id');
        $per_page = $request->input('per_page');
        $total_viewed = $request->input('total_viewed');

        $dataDisplay=[];
        $dataArray = [];
        $getCar = CarOwnerCar::select('co_master.co_fname', 'co_master.co_lname', 'co_master.co_phone', 'co_master.email','co_master.isd_code', 'co_car.id as coCarId', 'co_car.car_registration_no', 'co_car.make',)
                            ->join('co_master','co_master.id','=','co_car.co_id')
                            ->where('co_car.co_id', $co_id)
                            ->orderBy('co_car.id', 'desc');
        $carCount = $getCar->count();                    
        $getCar = $getCar->limit($per_page)
                        ->offset($total_viewed)
                        ->get();
                            // echo "<pre>";print_r($getCar->toArray());exit;
        if($getCar != ''){
            foreach ($getCar as $d) {
                $dataDisplay['owner_name'] = $d->co_fname . ' ' . $d->co_lname; 
                $dataDisplay['car_id'] = $d->coCarId;
                $dataDisplay['car_registration_no'] = $d->car_registration_no;
                $dataDisplay['make'] = $d->make;

                $dataWash = WashDetail::select('wash_details.id as washId', 'wash_details.car_id', 'wash_details.entry_date', 'wash_details.wash_type_id', 'wash_details.body_type', 'wash_details.amount', 'wash_details.date_washed', 'wash_details.time_washed', 'wash_details.status as wash_status', 'wash_details.payment_status', 'wash_details.payment_details', 'cwo_master.cwo_name', 'cwo_master.cwo_company', 'cwo_master.cwo_isd', 'cwo_master.cwo_phone', 'wash_details.driver_name', 'wash_details.driver_isd_code', 'wash_details.driver_phone', 'wash_details.total_amount', 'wash_details.is_free_wash', 'wash_details.driver_email', 'wash_details.wash_in', 'wash_details.wash_out')
                ->leftJoin('cwo_master', 'cwo_master.id', '=', 'wash_details.cwo_id')
                ->leftJoin('currency_masters', 'currency_masters.id', '=', 'cwo_master.currency_id')
                ->where('wash_details.car_id', $d->coCarId);
                $dataWash = $dataWash->orderBy('wash_details.id', 'desc');
                $dataWash = $dataWash->take(1)->get();
                // echo "<pre>";print_r($dataWash->toArray());
                if(count($dataWash) > 0) {
                    $dataDisplay['wash_id'] = $dataWash[0]->washId;    
                    $dataDisplay['cwo_company'] = $dataWash[0]->cwo_company;    
                    $dataDisplay['date_washed'] = $dataWash[0]->date_washed; 
                    if($dataWash[0]->cwo_phone != ''){
                        $dataDisplay['cwo_phone'] = '+' . $dataWash[0]->cwo_isd . $dataWash[0]->cwo_phone;
                    } else {
                        $dataDisplay['cwo_phone'] = '';  
                    } 
                    $wash_types = WashTypeToWash::select('wash_categories.wash_name', 'wash_type_to_washes.price')
                            ->join('wash_categories', 'wash_categories.id', '=', 'wash_type_to_washes.wash_type_id')
                            ->where('wash_type_to_washes.wash_id', $dataWash[0]->washId)
                            ->orderBy('wash_type_to_washes.id', 'asc')
                            ->get();
                    $dataDisplay['wash_types'] = $wash_types;  
                    if($dataWash[0]->wash_type_id > 0){
                        $getWashType = WashCategory::where('id', $dataWash[0]->wash_type_id)->select('wash_name')->first();
                        if($getWashType != ''){
                            $dataDisplay['wash_name'] = $getWashType->wash_name;    
                        } else {
                            $dataDisplay['wash_name'] = '';
                        }
                    } else {
                        $dataDisplay['wash_name'] = '';
                    }    
                } else {
                    $dataDisplay['wash_id'] = 0;
                    $dataDisplay['cwo_company'] = ''; 
                    $dataDisplay['cwo_phone'] = ''; 
                    $dataDisplay['date_washed'] = ''; 
                    $dataDisplay['wash_types'] = '';
                    $dataDisplay['wash_name'] = ''; 
                }


                $dataArray[] = $dataDisplay;


            } // foreach ends

        }// if ends
        // exit;

        /*$data = CarOwnerCar::select('wash_details.id as washId', 'wash_details.car_id', 'wash_details.entry_date', 'wash_details.wash_type_id', 'wash_details.body_type', 'wash_details.amount', 'wash_details.date_washed', 'wash_details.time_washed', 'wash_details.status as wash_status', 'wash_details.payment_status', 'wash_details.payment_details', 'cwo_master.cwo_name', 'cwo_master.cwo_company', 'cwo_master.cwo_isd', 'cwo_master.cwo_phone', 'co_master.co_fname', 'co_master.co_lname', 'co_master.co_phone', 'co_master.email', 'co_car.id as coCarId', 'co_car.car_registration_no', 'co_car.make', 'currency_masters.symbol', 'wash_details.entry_time', 'co_master.isd_code', 'wash_details.driver_name', 'wash_details.driver_isd_code', 'wash_details.driver_phone', 'wash_details.total_amount', 'wash_details.is_free_wash', 'wash_details.driver_email', 'wash_details.wash_in', 'wash_details.wash_out')
        ->distinct(['wash_details.car_id'])
        ->join('co_master','co_master.id','=','co_car.co_id')
        ->leftJoin('wash_details','wash_details.car_id','=','co_car.id')
        ->leftJoin('cwo_master', 'cwo_master.id', '=', 'wash_details.cwo_id')
        ->leftJoin('currency_masters', 'currency_masters.id', '=', 'cwo_master.currency_id')
        ->where('co_car.co_id', $co_id);
        $data = $data->orderBy('wash_details.id', 'desc');
        $dataCount = $data->count();
        $data = $data->get();
        // $data = $data->take(1)->get();
        // echo "<pre>";print_r($data->toArray());exit;

        $dataDisplay=[];
        $dataArray = [];
        if($data != '') {
            foreach ($data as $d) {
                $dataDisplay['owner_name'] = $d->co_fname . ' ' . $d->co_lname; 
                $dataDisplay['car_id'] = $d->coCarId;
                $dataDisplay['car_registration_no'] = $d->car_registration_no;
                $dataDisplay['make'] = $d->make;
                $dataDisplay['wash_id'] = $d->washId;
                if($d->washId > 0){
                    $dataDisplay['cwo_company'] = $d->cwo_company;    
                    $dataDisplay['date_washed'] = $d->date_washed; 
                    if($d->cwo_phone != ''){
                        $dataDisplay['cwo_phone'] = '+' . $d->cwo_isd . $d->cwo_phone;
                    } else {
                        $dataDisplay['cwo_phone'] = '';  
                    } 
                    $wash_types = WashTypeToWash::select('wash_categories.wash_name', 'wash_type_to_washes.price')
                            ->join('wash_categories', 'wash_categories.id', '=', 'wash_type_to_washes.wash_type_id')
                            ->where('wash_type_to_washes.wash_id', $d->washId)
                            ->orderBy('wash_type_to_washes.id', 'asc')
                            ->get();
                    $dataDisplay['wash_types'] = $wash_types;  
                    if($d->wash_type_id > 0){
                        $getWashType = WashCategory::where('id', $d->wash_type_id)->select('wash_name')->first();
                        if($getWashType != ''){
                            $dataDisplay['wash_name'] = $getWashType->wash_name;    
                        } else {
                            $dataDisplay['wash_name'] = '';
                        }
                    } else {
                        $dataDisplay['wash_name'] = '';
                    }
                } else {
                    $dataDisplay['cwo_company'] = ''; 
                    $dataDisplay['cwo_phone'] = ''; 
                    $dataDisplay['date_washed'] = ''; 
                    $dataDisplay['wash_types'] = '';
                    $dataDisplay['wash_name'] = ''; 
                }

                $dataArray[] = $dataDisplay;
            }
        }*/
        return response()->json([
            'success' => 1,
            'message' => 'Success',
            'count' => $carCount,
            'carList' => $dataArray
        ]);

    }

    public function updateCar(Request $request){
        $car_id = $request->input('car_id');
        $validate = Validator::make(
            $request->all(),
            [   
                'car_id' => 'required',
                'car_registration_no' => 'required|unique:co_car,car_registration_no,' . $car_id,
            ],
            [
                'car_registration_no.unique' => 'This car registration number already exists.'
            ]
        );
        if($validate->fails()) {
            $errorString = implode(",", $validate->messages()->all());
            return response()->json([
                'success' => 0,
                'message' => $errorString,
            ]);
        }

        $car_registration_no = $request->input('car_registration_no');
        $make = $request->input('make');
        $dt = Carbon::now();

        $item = CarOwnerCar::where('id', $car_id)->first();
        $data = [
            'car_registration_no' => $car_registration_no,
            'make' => $make,
            'updated_at' => $dt->toDayDateTimeString()
        ];
        $item->update($data);
        return response()->json([
                'success' => 1,
                'message' => 'Success',
                'car_id' => $car_id
            ]);
    }

    public function getLatestCars(Request $request){
        $validate = Validator::make(
            $request->all(),
            [
                'co_id' => 'required'
            ],
            [
                // 'co_id.required' => 'Please enter car owner id'
            ]
        );
        if($validate->fails()) {
            $errorString = implode(",", $validate->messages()->all());
            return response()->json([
                'success' => 0,
                'message' => $errorString,
            ]);
        }
        $co_id = $request->input('co_id');

        $dataDisplay=[];
        $dataArray = [];
        $getCar = CarOwnerCar::select('co_master.co_fname', 'co_master.co_lname', 'co_master.co_phone', 'co_master.email','co_master.isd_code', 'co_car.id as coCarId', 'co_car.car_registration_no', 'co_car.make',)
                            ->join('co_master','co_master.id','=','co_car.co_id')
                            ->where('co_car.co_id', $co_id)
                            ->orderBy('co_car.id', 'desc')
                            ->take(3)
                            ->get();
                            // echo "<pre>";print_r($getCar->toArray());exit;
        if($getCar != ''){
            foreach ($getCar as $d) {
                $dataDisplay['owner_name'] = $d->co_fname . ' ' . $d->co_lname; 
                $dataDisplay['car_id'] = $d->coCarId;
                $dataDisplay['car_registration_no'] = $d->car_registration_no;
                $dataDisplay['make'] = $d->make;

                $dataWash = WashDetail::select('wash_details.id as washId', 'wash_details.car_id', 'wash_details.entry_date', 'wash_details.wash_type_id', 'wash_details.body_type', 'wash_details.amount', 'wash_details.date_washed', 'wash_details.time_washed', 'wash_details.status as wash_status', 'wash_details.payment_status', 'wash_details.payment_details', 'cwo_master.cwo_name', 'cwo_master.cwo_company', 'cwo_master.cwo_isd', 'cwo_master.cwo_phone', 'wash_details.driver_name', 'wash_details.driver_isd_code', 'wash_details.driver_phone', 'wash_details.total_amount', 'wash_details.is_free_wash', 'wash_details.driver_email', 'wash_details.wash_in', 'wash_details.wash_out')
                ->leftJoin('cwo_master', 'cwo_master.id', '=', 'wash_details.cwo_id')
                ->leftJoin('currency_masters', 'currency_masters.id', '=', 'cwo_master.currency_id')
                ->where('wash_details.car_id', $d->coCarId);
                $dataWash = $dataWash->orderBy('wash_details.id', 'desc');
                $dataWash = $dataWash->take(1)->get();
                // echo "<pre>";print_r($dataWash->toArray());
                if(count($dataWash) > 0) {
                    $dataDisplay['wash_id'] = $dataWash[0]->washId;    
                    $dataDisplay['cwo_company'] = $dataWash[0]->cwo_company;    
                    $dataDisplay['date_washed'] = $dataWash[0]->date_washed; 
                    if($dataWash[0]->cwo_phone != ''){
                        $dataDisplay['cwo_phone'] = '+' . $dataWash[0]->cwo_isd . $dataWash[0]->cwo_phone;
                    } else {
                        $dataDisplay['cwo_phone'] = '';  
                    } 
                    $wash_types = WashTypeToWash::select('wash_categories.wash_name', 'wash_type_to_washes.price')
                            ->join('wash_categories', 'wash_categories.id', '=', 'wash_type_to_washes.wash_type_id')
                            ->where('wash_type_to_washes.wash_id', $dataWash[0]->washId)
                            ->orderBy('wash_type_to_washes.id', 'asc')
                            ->get();
                    $dataDisplay['wash_types'] = $wash_types;  
                    if($dataWash[0]->wash_type_id > 0){
                        $getWashType = WashCategory::where('id', $dataWash[0]->wash_type_id)->select('wash_name')->first();
                        if($getWashType != ''){
                            $dataDisplay['wash_name'] = $getWashType->wash_name;    
                        } else {
                            $dataDisplay['wash_name'] = '';
                        }
                    } else {
                        $dataDisplay['wash_name'] = '';
                    }    
                } else {
                    $dataDisplay['wash_id'] = 0;
                    $dataDisplay['cwo_company'] = ''; 
                    $dataDisplay['cwo_phone'] = ''; 
                    $dataDisplay['date_washed'] = ''; 
                    $dataDisplay['wash_types'] = '';
                    $dataDisplay['wash_name'] = ''; 
                }


                $dataArray[] = $dataDisplay;


            } // foreach ends

        }// if ends
        // exit;
        return response()->json([
            'success' => 1,
            'message' => 'Success',
            // 'count' => $dataCount,
            'carList' => $dataArray
        ]);

    }

    public function totalRecords(Request $request){
        $validate = Validator::make(
            $request->all(),
            [
                'co_id' => 'required'
            ],
            [
                // 'co_id.required' => 'Please enter car owner id'
            ]
        );
        if($validate->fails()) {
            $errorString = implode(",", $validate->messages()->all());
            return response()->json([
                'success' => 0,
                'message' => $errorString,
            ]);
        }
        $co_id = $request->input('co_id');

        $totalCarCount = CarOwnerCar::where('co_id', $co_id)
                                    ->orderBy('co_car.id', 'desc')
                                    ->count();

        $totalCarWashCount = WashDetail::select(DB::raw('COUNT(wash_details.car_id) as total_car_count'))
            ->join('co_car','co_car.id','=','wash_details.car_id')
            ->join('co_master','co_master.id','=','co_car.co_id')
            ->where('co_car.co_id', $co_id)
            ->where(function($query) {  
                    $query->where('wash_details.status', 3)
                        ->orWhere('wash_details.status', 5);
                })
            ->get(); 
        // echo "<pre>";print_r($totalCarWashCount->toArray());exit;  

        $totalSpentCount = WashDetail::select(DB::raw('SUM(wash_details.total_amount) as total_spent_count'))
            ->join('co_car','co_car.id','=','wash_details.car_id')
            ->join('co_master','co_master.id','=','co_car.co_id')
            ->where('co_car.co_id', $co_id)
            ->where('wash_details.payment_status', 1)
            ->where(function($query) {  
                    $query->where('wash_details.status', 3)
                        ->orWhere('wash_details.status', 5);
                })
            ->get(); 
        // echo "<pre>";print_r($totalSpentCount->toArray());exit;                              

        return response()->json([
            'success' => 1,
            'message' => 'Success',
            'totalCarCount' => $totalCarCount,
            'totalCarWashCount' => $totalCarWashCount[0]->total_car_count,
            'totalSpentCount' => formatCurrency($totalSpentCount[0]->total_spent_count),
        ]);                            

    }

    



}
