<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\CarOwner;
use App\Models\CarOwnerCar;
use App\Models\BodyType;
use App\Models\WashTypeToWash;
use App\Models\WashCategory;
use App\Models\CarWashOwner;
use App\Models\CurrencyMaster;
use App\Models\Settings;
use App\Models\BusinessHours;
use App\Models\WashCategoryBodyType;
use App\Models\CwoPreBookingType;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;
use Config;

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


    public function index(){
    }

    public function getCwoFromLatLong(Request $request){
        $validate = Validator::make(
            $request->all(),
            [
                'latitude' => 'required',
                'longitude' => 'required',
                'per_page' => 'required',
                'total_viewed' => 'required'
            ],
            [
                'latitude.required' => 'Please enter a latitude',
                'longitude.required' => 'Please enter a longitude',
                'per_page.required' => 'Please enter per page',
                'total_viewed.required' => 'Please enter a total records viewed',
            ]
        );
        if($validate->fails()) {
            $errorString = implode(",", $validate->messages()->all());
            return response()->json([
                'success' => 0,
                'message' => $errorString,
            ]);
        }
        $latitude = $request->input('latitude');
        $longitude = $request->input('longitude');
        $per_page = $request->input('per_page');
        $total_viewed = $request->input('total_viewed');

        // $getCwo = SELECT id, ( 6371 * acos( cos( radians(18.5789) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(73.7707) ) + sin( radians(18.5789) ) * sin( radians( latitude ) ) ) ) AS distance FROM vechiles HAVING distance < 50 ORDER BY distance ;

        $getDistance = Settings::select('setting_value')->where('setting_id', 'cwo_lat_long_distance')->first();
        if($getDistance != ''){
            if($getDistance->setting_value != ''){
                $distance = $getDistance->setting_value;
            } else {
                $distance = 5;
            }
        } else {
            $distance = 5;
        }

        $data =  CarWashOwner::select(DB::raw("*, ( 6371 * acos( cos( radians('$latitude') ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians( `lat` ) ) ) ) AS distance"))
                ->where('is_active', 1)
                ->where('is_paid', 1)
                // ->havingRaw('distance <= '. $distance)
                // ->limit($per_page)
                // ->offset($total_viewed)
                ->whereNotNull('lat')
                ->orderBy('distance', 'asc');
        $dataCount = $data->count();
        if($dataCount == 0){
            $data =  CarWashOwner::select(DB::raw("*, ( 6371 * acos( cos( radians('$latitude') ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians( `lat` ) ) ) ) AS distance"))
                ->where('is_active', 1)
                ->where('is_paid', 1)
                ->whereNotNull('lat')
                // ->havingRaw('distance <= 300')
                // ->limit($per_page)
                // ->offset($total_viewed)
                ->orderBy('distance', 'asc');    
        }
        $dataCount = $data->count();
        $data = $data->limit($per_page)->offset($total_viewed);
        $data = $data->get(); 
        // echo "<pre>";print_r($data->toArray());exit;

        $dataDisplay=[];
        $dataArray = [];
        if($data != '') {
            foreach ($data as $d) {
                $dataDisplay['id'] = $d->id; 
                $dataDisplay['account_no'] = $d->account_no;
                $dataDisplay['cwo_name'] = $d->cwo_name;
                $dataDisplay['cwo_company'] = $d->cwo_company;
                $dataDisplay['cwo_isd'] = $d->cwo_isd;
                $dataDisplay['cwo_phone'] = $d->cwo_phone;
                $dataDisplay['cwo_email'] = $d->cwo_email;
                $dataDisplay['address'] = $d->address;
                $dataDisplay['lat'] = $d->lat;
                $dataDisplay['long'] = $d->long;
                $dataDisplay['allow_prebooking'] = $d->allow_prebooking;
                if($d->allow_prebooking == 1){
                    $dataDisplay['allow_prebooking_text'] = 'Yes';
                    $prebookingTypes = CwoPreBookingType::select('cwo_pre_booking_types.prebooking_type_id', 'pre_booking_types.type')
                        ->join('pre_booking_types', 'pre_booking_types.id', 'cwo_pre_booking_types.prebooking_type_id')
                        ->orderBy('pre_booking_types.id', 'asc')
                        ->where('cwo_pre_booking_types.cwo_id', $d->id)
                        ->get();
                    $dataDisplay['prebooking_types'] =  $prebookingTypes;   
                } else {
                    $dataDisplay['allow_prebooking_text'] = 'No';
                    $dataDisplay['prebooking_types'] =  '';   
                }
                $getCurrency = CurrencyMaster::where('id', $d->currency_id)->first();
                if($getCurrency != ''){
                    $dataDisplay['currency_code'] = $getCurrency->code;
                    $dataDisplay['currency_symbol'] = $getCurrency->symbol;
                } else {
                    $dataDisplay['currency_code'] = '';
                    $dataDisplay['currency_symbol'] = '';
                }
                // $dataDisplay['distance'] = round($d->distance, 1) . ' km';
                if($d->distance != '') {
                    $dataDisplay['distance'] = round($d->distance, 1) . ' km';
                } else {
                    $dataDisplay['distance'] = '';
                }
                

                $dataDisplay['cwo_business_details'] = $d->cwo_business_details;
                if($d->cwo_logo != ''){
                    $dataDisplay['cwo_logo'] = asset('images/cwo') . '/' . $d->cwo_logo;
                } else {
                    // $cwo_logo = '';
                    // $dataDisplay['cwo_logo'] = asset('app-assets/images/logo/logo.png');
                    $dataDisplay['cwo_logo'] = '';
                }

                $currentDay = date('l');
                $dataDisplay['day'] = $currentDay;
                $dataDisplay['from_hours'] = '';
                $dataDisplay['to_hours'] = '';
                $dataDisplay['status'] = '';
                $businessHours = BusinessHours::select('day', 'from_hours', 'to_hours', 'status')
                                            ->where('cwo_id', $d->id)
                                            ->where('day', $currentDay)
                                            ->first();
                if($businessHours != ''){
                    if($businessHours->from_hours != ''){
                        $dataDisplay['from_hours'] = date("H:i", strtotime($businessHours->from_hours));
                    }
                    if($businessHours->to_hours != ''){
                        $dataDisplay['to_hours'] = date("H:i", strtotime($businessHours->to_hours));
                    }
                    $dataDisplay['status'] = $businessHours->status;
                    if($businessHours->status == 'Close') {
                        $dataDisplay['status'] = 'Closed';
                    }
                }  

                $dataDisplay['rating'] = getCwoRating($d->id);
                $dataDisplay['reviewCount'] = getCwoReviewCount($d->id);                      
                

                $dataArray[] = $dataDisplay;
            }
        }
        return response()->json([
            'success' => 1,
            'message' => 'Success',
            'count' => $dataCount,
            'cwoList' => $dataArray
        ]);

    }

    public function getWashTypes(Request $request){
         $validate = Validator::make($request->all(), 
            [
                'cwo_id' => 'required',
                'body_type_id' => 'required',
            ]);
            
        if($validate->fails()){
            $errorString = implode(",",$validate->messages()->all());
            return response()->json([
                'success' => 0,
                // 'message' => $validate->errors(),
                'message' => $errorString,
            ]);
        }

        $cwo_id = $request->input('cwo_id');
        $body_type_id = $request->input('body_type_id');

        $data =WashCategory::select('wash_categories.wash_name','wash_categories.wash_desc','wash_category_body_types.price','wash_category_body_types.wash_category_id')
                    ->join('wash_category_body_types','wash_categories.id','=','wash_category_body_types.wash_category_id')
                    ->where('wash_categories.cwo_id', $cwo_id)
                    ->where('wash_category_body_types.body_type_id', $body_type_id)
                    ->where('wash_categories.is_active', 1)
                    ->orderBy('wash_categories.wash_name', 'asc')
                    ->get();
        return response()->json([
            'success' => 1,
            'message' => 'Success',
            'washCategories' => $data
        ]);            

    }

    public function cwoDetails(Request $request){
        $validate = Validator::make($request->all(), 
            [
                'cwo_id' => 'required'
            ]);
            
        if($validate->fails()){
            $errorString = implode(",",$validate->messages()->all());
            return response()->json([
                'success' => 0,
                'message' => $errorString,
            ]);
        }

        $cwo_id = $request->input('cwo_id');
        $latitude = $request->input('latitude');
        $longitude = $request->input('longitude');
        $distance = '';

        $cwoDetails =CarWashOwner::select('cwo_name','cwo_company','cwo_business_details','address','cwo_isd','cwo_phone','cwo_email','cwo_logo', 'lat', 'long', 'currency_id', 'lat', 'long', 'allow_prebooking')->where('id', $cwo_id)->first();
        if($latitude != '' && $longitude != '') {
            $dataDistance =  CarWashOwner::select(DB::raw("*, ( 6371 * acos( cos( radians('$latitude') ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians( `lat` ) ) ) ) AS distance"))
            ->where('id', $cwo_id)
            ->first();
            // print_r($dataDistance->toArray());exit;
            // echo round($dataDistance->distance, 1) . ' km';exit;
            if($dataDistance->distance != '') {
                $distance = round($dataDistance->distance, 1) . ' km';
            } else {
                $distance = $dataDistance->distance;
            }
        }

        $dataDisplay=[];
        $dataArray = [];
        $washCategories =WashCategory::select('id','wash_name','wash_desc')->where('cwo_id', $cwo_id)->where('is_active', 1)->get();
        if($washCategories != ''){
            foreach ($washCategories as $d) {
                $dataDisplay['id'] = $d->id; 
                $dataDisplay['wash_name'] = $d->wash_name; 
                $dataDisplay['wash_desc'] = $d->wash_desc; 

                $body_types = WashCategoryBodyType::select('body_types.name','wash_category_body_types.body_type_id','wash_category_body_types.price')
                    ->join('body_types','body_types.id','=','wash_category_body_types.body_type_id')
                    ->where('wash_category_body_types.wash_category_id', $d->id)
                    ->where('body_types.status', 1)
                    ->orderBy('body_types.id', 'asc')
                    ->get();
                if($body_types != '') {
                    // $dataDisplay['body_types'] = $body_types;  
                    $typesArr = [];
                    foreach($body_types as $bt) {
                        $types =
                                array(
                                    'name' => $bt->name,
                                    'body_type_id' => $bt->body_type_id,
                                    'price' => ' ',
                                );
                        array_push($typesArr, $types);      
                        $dataDisplay['body_types'] = $typesArr;          
                    } 
                }  

                $dataArray[] = $dataDisplay;
            }
        }

        if($cwoDetails->cwo_logo != ''){
            $cwo_logo = asset('images/cwo') . '/' . $cwoDetails->cwo_logo;
        } else {
            // $cwo_logo = asset('app-assets/images/logo/logo.png');
            $cwo_logo = '';
        }

        $currentDay = date('l');
        $day = $currentDay;
        $from_hours = '';
        $to_hours = '';
        $status = '';
        $businessHours = BusinessHours::select('day', 'from_hours', 'to_hours', 'status')
                                    ->where('cwo_id', $cwo_id)
                                    ->where('day', $currentDay)
                                    ->first();
        if($businessHours != ''){
            if($businessHours->from_hours != ''){
                $from_hours = date("H:i", strtotime($businessHours->from_hours));
            }
            if($businessHours->to_hours != ''){
                $to_hours = date("H:i", strtotime($businessHours->to_hours));
            }
            $status = $businessHours->status;
            if($status == 'Close') {
                $status = 'Closed';
            }
        }  
        // echo $cwoDetails->currency_id;exit;
        $getCurrency = CurrencyMaster::findorfail($cwoDetails->currency_id);

        $getRating = getCwoRating($cwo_id);
        $getReviewCount = getCwoReviewCount($cwo_id);

        $allow_prebooking = $cwoDetails->allow_prebooking;
        if($allow_prebooking == 1){
            $allow_prebooking_text = 'Yes';
            $prebookingTypes = CwoPreBookingType::select('cwo_pre_booking_types.prebooking_type_id', 'pre_booking_types.type')
                ->join('pre_booking_types', 'pre_booking_types.id', 'cwo_pre_booking_types.prebooking_type_id')
                ->orderBy('pre_booking_types.id', 'asc')
                ->where('cwo_pre_booking_types.cwo_id', $cwo_id)
                ->get();
            $prebooking_types =  $prebookingTypes;  
        } else {
            $allow_prebooking_text = 'No';
            $prebooking_types =  '';
        }

        $getCwoArray = [
                'cwo_name' => $cwoDetails->cwo_name,
                'cwo_company' => $cwoDetails->cwo_company,
                'cwo_business_details' => $cwoDetails->cwo_business_details,
                'address' => $cwoDetails->address,
                'lat' => $cwoDetails->lat,
                'long' => $cwoDetails->long,
                'cwo_isd' => $cwoDetails->cwo_isd,
                'cwo_phone' => $cwoDetails->cwo_phone,
                'cwo_email' => $cwoDetails->cwo_email,
                'cwo_logo' => $cwo_logo,
                'day' => $day,
                'from_hours' => $from_hours,
                'to_hours' => $to_hours,
                'status' => $status,
                'allow_prebooking' => $allow_prebooking,
                'allow_prebooking_text' => $allow_prebooking_text,
                'prebooking_types' => $prebooking_types,
                'distance' => $distance,
            ];

        return response()->json([
            'success' => 1,
            'message' => 'Success',
            // 'cwoDetails' => $cwoDetails,
            'cwoDetails' => $getCwoArray,
            // 'washCategories' => $washCategories
            // 'currency' => $getCurrency->symbol,
            'currency' => ' ',
            'rating' => $getRating,
            'reviewCount' => $getReviewCount,
            'washCategories' => $dataArray
        ]); 
    }

    public function searchCwo(Request $request){
        // $validate = Validator::make(
        //     $request->all(),
        //     [
        //         'cwo_company' => 'required',
        //         'city' => 'required',
        //     ],
        //     [
        //         'cwo_company.required' => 'Please enter a CWO company name',
        //         'city.required' => 'Please enter an address',
        //     ]
        // );
        // if($validate->fails()) {
        //     $errorString = implode(",", $validate->messages()->all());
        //     return response()->json([
        //         'success' => 0,
        //         'message' => $errorString,
        //     ]);
        // }
        // $cwo_company = $request->input('cwo_company');
        // $city = $request->input('city');

        $search_key = $request->input('search_key');
        // $search_array = explode(',', $search_key);
        // print_r($search_array);exit;
        // if (array_key_exists(1,$search_array)){
        //     echo "exists";
        // } else {
        //     echo "not";
        // }exit;
        $latitude = $request->input('latitude');
        $longitude = $request->input('longitude');

        if($latitude != '' && $longitude != '') {
            $data =  CarWashOwner::select(DB::raw("*, ( 6371 * acos( cos( radians('$latitude') ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians( `lat` ) ) ) ) AS distance"))
                ->where('is_active', 1)
                ->where('is_paid', 1)
                // ->havingRaw('distance <= '. $distance)
                // ->limit($per_page)
                // ->offset($total_viewed)
                ->whereNotNull('lat')
                ->orderBy('distance', 'asc');
        } else {
            $data =  CarWashOwner::where('is_active', 1)
                        ->where('is_paid', 1)
                        ->orderBy('id', 'desc');
        }

        if ($search_key != '') {
            /*if (array_key_exists(1,$search_array)){
                $data = $data->where(function($query) use ($search_array) {  
                    $query->where('cwo_company', 'like', '%' . $search_array[0] . '%')
                        ->orWhere('cwo_name', 'like', '%' . $search_array[0] . '%')
                        ->orWhere('account_no', 'like', '%' . $search_array[0] . '%');
                });
                $data = $data->where('address', 'like', '%' . $search_array[1] . '%');
            } else {
                $data = $data->where(function($query) use ($search_array) {  
                    $query->where('cwo_company', 'like', '%' . $search_array[0] . '%')
                        ->orWhere('cwo_name', 'like', '%' . $search_array[0] . '%')
                        ->orWhere('account_no', 'like', '%' . $search_array[0] . '%');
                });
            }*/

            $data = $data->where(function($query) use ($search_key) {  
                $query->where('cwo_company', 'like', '%' . $search_key . '%')
                    ->orWhere('cwo_name', 'like', '%' . $search_key . '%')
                    ->orWhere('account_no', 'like', '%' . $search_key . '%')
                    ->orWhere('address', 'like', '%' . $search_key . '%');
            });

        }
        $dataCount = $data->count();
        $data = $data->get(); 
        // echo "<pre>";print_r($data->toArray());exit;

        $dataDisplay=[];
        $dataArray = [];
        if($data != '') {
            foreach ($data as $d) {
                $dataDisplay['id'] = $d->id; 
                $dataDisplay['account_no'] = $d->account_no;
                $dataDisplay['cwo_name'] = $d->cwo_name;
                $dataDisplay['cwo_company'] = $d->cwo_company;
                $dataDisplay['cwo_isd'] = $d->cwo_isd;
                $dataDisplay['cwo_phone'] = $d->cwo_phone;
                $dataDisplay['cwo_email'] = $d->cwo_email;
                $dataDisplay['address'] = $d->address;
                $dataDisplay['lat'] = $d->lat;
                $dataDisplay['long'] = $d->long;
                $dataDisplay['allow_prebooking'] = $d->allow_prebooking;
                if($d->allow_prebooking == 1){
                    $dataDisplay['allow_prebooking_text'] = 'Yes';
                    $prebookingTypes = CwoPreBookingType::select('cwo_pre_booking_types.prebooking_type_id', 'pre_booking_types.type')
                        ->join('pre_booking_types', 'pre_booking_types.id', 'cwo_pre_booking_types.prebooking_type_id')
                        ->orderBy('pre_booking_types.id', 'asc')
                        ->where('cwo_pre_booking_types.cwo_id', $d->id)
                        ->get();
                    $dataDisplay['prebooking_types'] =  $prebookingTypes;   
                } else {
                    $dataDisplay['allow_prebooking_text'] = 'No';
                    $dataDisplay['prebooking_types'] =  '';   
                }
                $getCurrency = CurrencyMaster::where('id', $d->currency_id)->first();
                if($getCurrency != ''){
                    $dataDisplay['currency_code'] = $getCurrency->code;
                    $dataDisplay['currency_symbol'] = $getCurrency->symbol;
                } else {
                    $dataDisplay['currency_code'] = '';
                    $dataDisplay['currency_symbol'] = '';
                }

                if($d->distance != '') {
                    $dataDisplay['distance'] = round($d->distance, 1) . ' km';
                } else {
                    $dataDisplay['distance'] = '';
                }

                $dataDisplay['cwo_business_details'] = $d->cwo_business_details;
                if($d->cwo_logo != ''){
                    $dataDisplay['cwo_logo'] = asset('images/cwo') . '/' . $d->cwo_logo;
                } else {
                    // $cwo_logo = '';
                    // $dataDisplay['cwo_logo'] = asset('app-assets/images/logo/logo.png');
                    $dataDisplay['cwo_logo'] = '';
                }

                $currentDay = date('l');
                $dataDisplay['day'] = $currentDay;
                $dataDisplay['from_hours'] = '';
                $dataDisplay['to_hours'] = '';
                $dataDisplay['status'] = '';
                $businessHours = BusinessHours::select('day', 'from_hours', 'to_hours', 'status')
                                            ->where('cwo_id', $d->id)
                                            ->where('day', $currentDay)
                                            ->first();
                if($businessHours != ''){
                    if($businessHours->from_hours != ''){
                        $dataDisplay['from_hours'] = date("H:i", strtotime($businessHours->from_hours));
                    }
                    if($businessHours->to_hours != ''){
                        $dataDisplay['to_hours'] = date("H:i", strtotime($businessHours->to_hours));
                    }
                    $dataDisplay['status'] = $businessHours->status;

                    if($businessHours->status == 'Close') {
                        $dataDisplay['status'] = 'Closed';
                    }
                }

                $dataDisplay['rating'] = getCwoRating($d->id);
                $dataDisplay['reviewCount'] = getCwoReviewCount($d->id);           
                
                $dataArray[] = $dataDisplay;
            }
        }
        return response()->json([
            'success' => 1,
            'message' => 'Success',
            'count' => $dataCount,
            'cwoList' => $dataArray
        ]);

    }



}
