<?php

namespace App\Http\Controllers\OwnerPanel;

use App\Http\Controllers\Controller;
use App\Models\User;;

use App\Models\CarOwner;
use App\Models\CarOwnerCar;
use App\Models\PreBooking;
use App\Models\BodyType;
use App\Models\WashCategoryBodyType;
use App\Models\WashTypeToPrebooking;
use App\Models\CarWashOwner;
use App\Models\OptionalExtra;
use App\Models\CleanerWash;
use App\Models\WashTypeToWash;
use App\Models\WashDetail;
use Illuminate\Http\Request;
use Auth;
use Carbon\Carbon;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\View;
use DB;

class OwnerPreBookingController extends Controller
{
    public function index(Request $request)
    {
        $data['chMenu'] = "";
        $cwo_id = Auth::user()->cwo_id;
        $car_registration_no = $request->input('car_registration_no');
        $start_date = $request->input('start_date');
        if($start_date != ''){
            $start_date = date("Y-m-d", strtotime($start_date));
        }
        $end_date = $request->input('end_date');
        if($end_date != ''){
            $end_date = date("Y-m-d", strtotime($end_date));
        }

        $data = PreBooking::select('pre_bookings.id', 'pre_bookings.name', 'pre_bookings.isd_code', 'pre_bookings.phone_no', 'pre_bookings.date', 'pre_bookings.time', 'pre_bookings.date_time', 'pre_bookings.address', 'pre_bookings.body_type_id', 'pre_bookings.body_type', 'pre_bookings.amount', 'pre_bookings.total_amount', 'pre_bookings.status', 'pre_bookings.car_id', 'co_car.car_registration_no', 'pre_bookings.co_id', 'currency_masters.symbol', 'co_car.make', 'co_car.vehicle_color', 'co_car.car_model', 'pre_bookings.is_free_wash', 'pre_bookings.discount')
            ->join('co_car', 'co_car.id', '=', 'pre_bookings.car_id')
            ->join('co_master', 'co_master.id', '=', 'pre_bookings.co_id')
            ->join('cwo_master', 'cwo_master.id', '=', 'pre_bookings.cwo_id')
            ->leftJoin('currency_masters', 'currency_masters.id', '=', 'cwo_master.currency_id')
            ->where('pre_bookings.cwo_id', $cwo_id);
        $data = $data->orderBy('pre_bookings.id', 'desc');
        if ($car_registration_no != '') {
            $data = $data->where('co_car.car_registration_no', 'like', '%' . $car_registration_no . '%');
        }
        if($start_date != '') {
            $data->whereDate('pre_bookings.date', '>=', $start_date);
        } 
        if($end_date != '') {
            $data->whereDate('pre_bookings.date', '<=', $end_date);
        }

        $dataCnt = $data->count();
        $data = $data->paginate(10);
        $dataBag['allRecords'] = $dataCnt;
        $dataBag['records'] = $data;
        // echo "<pre>";print_r($dataBag['records']);exit;
        return view('owner.prebooking.list', $dataBag);
    }

    public function download(Request $request)
    {
        $cwo_id = Auth::user()->cwo_id;
        $fileName = 'pre-bookings.csv';
        $car_registration_no = $request->input('car_registration_no');
        $start_date = $request->input('start_date');
        if($start_date != ''){
            $start_date = date("Y-m-d", strtotime($start_date));
        }
        $end_date = $request->input('end_date');
        if($end_date != ''){
            $end_date = date("Y-m-d", strtotime($end_date));
        }

        $data = PreBooking::select('pre_bookings.id', 'pre_bookings.name', 'pre_bookings.isd_code', 'pre_bookings.phone_no', 'pre_bookings.date', 'pre_bookings.time', 'pre_bookings.date_time', 'pre_bookings.address', 'pre_bookings.body_type_id', 'pre_bookings.body_type', 'pre_bookings.amount', 'pre_bookings.total_amount', 'pre_bookings.status', 'pre_bookings.car_id', 'co_car.car_registration_no', 'pre_bookings.co_id', 'currency_masters.symbol', 'co_car.make', 'co_car.vehicle_color', 'co_car.car_model', 'pre_bookings.is_free_wash', 'pre_bookings.discount')
            ->join('co_car', 'co_car.id', '=', 'pre_bookings.car_id')
            ->join('co_master', 'co_master.id', '=', 'pre_bookings.co_id')
            ->join('cwo_master', 'cwo_master.id', '=', 'pre_bookings.cwo_id')
            ->leftJoin('currency_masters', 'currency_masters.id', '=', 'cwo_master.currency_id')
            ->where('pre_bookings.cwo_id', $cwo_id);
        $data = $data->orderBy('pre_bookings.id', 'desc');
        if ($car_registration_no != '') {
            $data = $data->where('co_car.car_registration_no', 'like', '%' . $car_registration_no . '%');
        }
        if($start_date != '') {
            $data->whereDate('pre_bookings.date', '>=', $start_date);
        } 
        if($end_date != '') {
            $data->whereDate('pre_bookings.date', '<=', $end_date);
        }

        $data = $data->get();

        $headers = array(
            "Content-type"        => "text/csv",
            "Content-Disposition" => "attachment; filename=$fileName",
            "Pragma"              => "no-cache",
            "Cache-Control"       => "must-revalidate, post-check=0, pre-check=0",
            "Expires"             => "0"
        );

        $columns = array('Sl No.', 'Logged in User', 'Client Name', 'Client Phone', 'Address', 'Car Registration No.', 'Car Make', 'Car Model', 'Vehicle Color', 'Body Type', 'Car Wash Type', 'Amount', 'Discount', 'Free Wash', 'Date', 'Time', 'Status');

        $callback = function () use ($data, $columns) {
            $file = fopen('php://output', 'w');
            fputcsv($file, $columns);

            $i = 1;
            foreach ($data as $d) {
                $row['sl_no'] = $i++;
                if(Auth::user()->email != ''){
                    $row['logged_in_user'] = Auth::user()->name . ' - ' . Auth::user()->email;
                } else {
                    $row['logged_in_user'] = Auth::user()->name;
                }
                $row['client_name']  = $d->name;
                $row['client_phone'] = '+' . $d->isd_code . $d->phone_no;
                $row['address']  = $d->address;
                $row['car_registration_no']  = $d->car_registration_no;
                $row['make']  = $d->make;
                $row['vehicle_color']  = $d->vehicle_color;
                $row['car_model']  = $d->car_model;
                $row['body_type']  = $d->body_type;
                $row['wash_categories']  = getWashTypesOfPreBooking($d->id);
                $row['amount']  = $d->total_amount;
                if ($d->date != '') {
                    $row['date']  = date("Y/m/d", strtotime($d->date));
                } else {
                    $row['date'] = '';
                }
                if ($d->time != '') {
                    $row['time']  = date("H:i", strtotime($d->time));
                } else {
                    $row['time'] = '';
                }
                if ($d->status == 1) {
                    $row['status']  = 'Pending';
                } 
                if ($d->status == 2) {
                    $row['status']  = 'Confirmed';
                } 
                if ($d->status == 3) {
                    $row['status']  = 'Declined';
                } 
                if ($d->status == 4) {
                    $row['status']  = 'Wash Started';
                }
                if($d->is_free_wash == 1) {
                    $dataDisplay['is_free_wash'] = 'Yes';
                }
                if($d->is_free_wash == 0) {
                    $dataDisplay['is_free_wash'] = 'No';
                }
                $row['discount']  = $d->discount . "%";

                fputcsv($file, array($row['sl_no'], $row['logged_in_user'], $row['client_name'], $row['client_phone'], $row['address'], $row['car_registration_no'], $row['make'], $row['car_model'], $row['vehicle_color'], $row['body_type'], $row['wash_categories'], $row['amount'], $row['discount'], $dataDisplay['is_free_wash'], $row['date'], $row['time'], $row['status']));
            }

            fclose($file);
        };

        return response()->stream($callback, 200, $headers);
    }

    public function printWashDetail($id)
    {
        // $wash_id = $request->input('wash_id');
        // echo $wash_id;exit;
        // $dataBag['cwo'] = CarWashOwner::where('account_no', $account_no)->first();
        $data = WashDetail::select('wash_details.id', 'wash_details.car_id', 'wash_details.date_washed', 'wash_details.time_washed', 'wash_details.status', 'wash_details.payment_status', 'co_master.co_fname', 'co_master.co_lname', 'co_master.co_phone', 'co_car.car_registration_no', 'wash_details.otp', 'wash_details.payment_details', 'wash_details.amount', 'wash_details.total_amount', 'co_master.isd_code', 'wash_details.driver_name', 'wash_details.driver_isd_code', 'wash_details.driver_phone', 'cwo_master.cwo_logo', 'wash_details.wash_type_id', 'co_car.make', 'co_car.car_model', 'co_car.vehicle_color')
        ->join('co_car', 'co_car.id', '=', 'wash_details.car_id')
        ->join('co_master', 'co_master.id', '=', 'co_car.co_id')
        ->join('users', 'users.id', '=', 'co_master.user_id')
        ->join('cwo_master', 'cwo_master.id', '=', 'wash_details.cwo_id')
        ->leftJoin('currency_masters', 'currency_masters.id', '=', 'cwo_master.currency_id')
        ->where('wash_details.id', $id);
        $data = $data->get();
        // echo "<pre>";print_r($data->toArray());exit;
        $dataBag['id'] = $data[0]->id;
        $dataBag['car_id'] = $data[0]->car_id;
        if($data[0]->driver_name != ''){
            $dataBag['co_fname'] = $data[0]->driver_name;
            $dataBag['co_lname'] = '';
        } else {
            $dataBag['co_fname'] = $data[0]->co_fname;
            $dataBag['co_lname'] = $data[0]->co_lname;
        }
        if($data[0]->driver_phone != ''){
            $dataBag['isd_code'] = '+' . $data[0]->driver_isd_code;
            $dataBag['co_phone'] = $data[0]->driver_phone;
        } else {
            $dataBag['isd_code'] = '+' . $data[0]->isd_code;
            $dataBag['co_phone'] = $data[0]->co_phone;
        }
        $dataBag['car_registration_no'] = $data[0]->car_registration_no;
        $dataBag['make'] = $data[0]->make;
        $dataBag['car_model'] = $data[0]->car_model;
        $dataBag['vehicle_color'] = $data[0]->vehicle_color;
        // $dataBag['wash_name'] = $data[0]->wash_name;
        if($data[0]->date_washed != '') {
            $dataBag['date_washed']  = date("d/m/Y", strtotime($data[0]->date_washed));
        } else {
            $dataBag['date_washed']  = '';
        }
        if($data[0]->time_washed != '') {
            $dataBag['time_washed']  = date("h:i a", strtotime($data[0]->time_washed));
        } else {
            $dataBag['time_washed']  = '';
        }
        $dataBag['payment_status_id'] = $data[0]->payment_status;
        if($data[0]->payment_status == 1) {
            $dataBag['payment_status'] = 'Paid';
        } else {
            $dataBag['payment_status'] = 'Not Paid';
        }
        $dataBag['status_id'] = $data[0]->status;
        if($data[0]->status == 0) {
            $dataBag['status'] = 'Car in-queue';
        }
        if($data[0]->status == 1) {
            $dataBag['status'] = 'In Wash Bay';
        }
        if($data[0]->status == 2) {
            $dataBag['status'] = 'Finishing Bay';
        }
        if($data[0]->status == 3) {
            $dataBag['status'] = 'Car Wash Completed';
        }
        if($data[0]->status == 4) {
            $dataBag['status'] = 'Cancelled';
        }
        $dataBag['otp'] = $data[0]->otp;
        $dataBag['payment_mode'] = $data[0]->payment_details;
        $dataBag['wash_amount'] = $data[0]->amount;
        $dataBag['total_amount'] = $data[0]->total_amount;
        $optionalExtra = OptionalExtra::where('wash_id', $data[0]->id)->select('optional_extra', 'price')->orderBy('id', 'asc')->get();
        $dataBag['extras'] = $optionalExtra;
        $cleaners = CleanerWash::select('cleaner_masters.name', 'cleaner_washes.description as cleaning_description')
                            ->join('cleaner_masters', 'cleaner_masters.id', '=', 'cleaner_washes.cleaner_id')
                            ->where('cleaner_washes.wash_id', $data[0]->id)
                            ->orderBy('cleaner_washes.id', 'asc')
                            ->get();
        $dataBag['cleaners'] = $cleaners;

        if($data[0]->cwo_logo != ''){
            $dataBag['cwo_logo'] = asset('images/cwo') . '/' . $data[0]->cwo_logo;
        } else {
            $dataBag['cwo_logo'] = '';
        }

        $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', $data[0]->id)
                            ->orderBy('wash_type_to_washes.id', 'asc')
                            ->get();
        $dataBag['wash_types'] = $wash_types;

        if($data[0]->wash_type_id > 0){
            $getWashType = WashCategory::where('id', $data[0]->wash_type_id)->select('wash_name')->first();
            if($getWashType != ''){
                $dataBag['wash_name'] = $getWashType->wash_name;    
            } else {
                $dataBag['wash_name'] = '';
            }
        } else {
            $dataBag['wash_name'] = '';
        }
        // echo "<pre>";print_r($dataBag);exit;
        return view('print.washdetail', $dataBag);
    }

    public function delete($id)
    {
        $record = PreBooking::find($id); // fetch the record
        $record->delete();

        $optionalExtra = OptionalExtra::where('prebooking_id', $id);
        $optionalExtra->delete();

        $cleanerWash = CleanerWash::where('prebooking_id', $id);
        $cleanerWash->delete();

        $washTypeToWash = WashTypeToWash::where('prebooking_id', $id);
        $washTypeToWash->delete();

        $washDetail = WashDetail::where('prebooking_id', $id);
        $washDetail->delete();

        return back()->with('msg', 'Pre-booking record has been deleted successfully.')
            ->with('msg_class', 'alert alert-success');
    }

    public function edit($id)
    {
        $record = WashDetail::find($id); // fetch the record
        // echo "wash_id-> " . $id . ", cwo_id-> " . $record->cwo_id . ", body_type_id-> " . $record->body_type_id;exit; 
        $dataBag['details'] = $record;
        // echo "<pre>";print_r($dataBag['details']);exit;

        $dataBag['carDetails'] = CarOwnerCar::find($record->car_id);

        $data = WashCategory::where('cwo_id', $record->cwo_id)->where('is_active', 1)->orderBy('wash_name', 'asc')->select('id', 'wash_name', 'wash_desc')->get();
        $dataDisplay=[];
        $dataArray = [];
        if($data != ''){
            foreach ($data as $d) {
                $dataDisplay['id'] = $d->id;
                $dataDisplay['wash_name'] = $d->wash_name;
                $dataDisplay['wash_desc'] = $d->wash_desc;
                // $dataDisplay['body_types'] = WashCategoryBodyType::where('wash_category_id', $d->id)->get();
                if($record->body_type_id == '') {
                    $dataDisplay['body_types'] = WashCategoryBodyType::select('body_types.name','wash_category_body_types.body_type_id','wash_category_body_types.price','wash_category_body_types.duration')
                    ->join('body_types','body_types.id','=','wash_category_body_types.body_type_id')
                    ->where('wash_category_body_types.wash_category_id', $d->id)
                    ->orderBy('body_types.id', 'asc')
                    ->get();
                } else {
                    $dataDisplay['body_types'] = WashCategoryBodyType::select('body_types.name','wash_category_body_types.body_type_id','wash_category_body_types.price','wash_category_body_types.duration')
                    ->join('body_types','body_types.id','=','wash_category_body_types.body_type_id')
                    ->where('wash_category_body_types.wash_category_id', $d->id)
                    ->where('wash_category_body_types.body_type_id', $record->body_type_id)
                    ->orderBy('body_types.id', 'asc')
                    ->get();
                }
                // echo "<pre>";print_r($dataDisplay['body_types']->toArray());
                

                $dataArray[] = $dataDisplay;
            }
            // exit;
        }
        $dataBag['washCategories'] = $dataArray;
        // echo "<pre>";print_r($dataBag);exit;

        $existingWashArray = array();
        $getExistingWash = WashTypeToWash::where('wash_id', $id)->select('wash_type_id')->get();
        if($getExistingWash != ''){
            foreach($getExistingWash as $w)
            array_push($existingWashArray, $w->wash_type_id);
        }
        $dataBag['existingWashArray'] = $existingWashArray;
        // echo "<pre>";print_r($existingWashArray);exit;

        $dataBag['optionalExtra'] = OptionalExtra::where('wash_id', $id)->select('optional_extra', 'price')->get();

        return view('owner.washreport.edit', $dataBag); 
    }

    public function update(Request $request, $id)
    {
        // echo $id;exit;
        $request->validate([
            'wash_category_id' => 'required',
            // 'optional_extra_price' => 'numeric|nullable',
            'driver_name' => 'required',
            'car_registration_no' => 'required|unique:co_car,car_registration_no,' . $request->input('car_id'),
        ], [
            'wash_category_id.required' => 'Please choose atleast one wash.',
            'driver_name.required' => 'Please enter a driver name.',
            'car_registration_no.unique' => 'This car registration number already exists.'
        ]);
        $wash_category_id = $request->input('wash_category_id');
        $price = $request->input('price');
        $optional_extra = $request->input('optional_extra');
        $optional_extra_price = $request->input('optional_extra_price');
        $wash_id = $id;
        // echo "<pre>"; print_r($optional_extra);
        // exit;
        // echo "<pre>"; print_r($optional_extra_price);exit;

        $driver_name = $request->input('driver_name');
        $driver_email = $request->input('driver_email');
        $driver_isd_code = $request->input('driver_isd_code');
        $driver_phone = $request->input('driver_phone');

        $car_id = $request->input('car_id');
        $car_registration_no = $request->input('car_registration_no');
        $make = $request->input('make');

        $payment_status = $request->input('payment_status');

        $dt = Carbon::now();

        $data = WashDetail::findOrFail($id);
        $is_free_wash = $data->is_free_wash;
        $body_type_id = $data->body_type_id;
        $free_wash_type_id = getLowestPrice($wash_category_id, $body_type_id);
        // echo $free_wash_type_id;exit;

        $amount = 0; 

        DB::delete("DELETE FROM `wash_type_to_washes` WHERE `wash_id` = " . $wash_id . "");
        if (count($wash_category_id) > 0) {
            for ($i = 0; $i < count($wash_category_id); $i++) {
                // echo $wash_category_id[$i] . '<br>';

                if($is_free_wash == 1){ // true starts
                    // echo "1";exit;
                    /*** free wash id logic starts ***/
                    if($free_wash_type_id != '' && $wash_category_id[$i] == $free_wash_type_id) {
                        $amount = $amount + 0; 
                        $wash_type_price = 0;   
                    } else {
                        $getPrice = WashCategoryBodyType::where('wash_category_id', $wash_category_id[$i])->where('body_type_id', $body_type_id)->first();
                        if($getPrice != ''){
                            $amount = $amount + $getPrice->price;
                            $wash_type_price = $getPrice->price;
                        } else {
                            $amount = $amount + 0;
                            $wash_type_price = 0;
                        }
                    }
                    /*** free wash id logic ends ***/
                } // true ends

                if($is_free_wash == 0){
                    $getPrice = WashCategoryBodyType::where('wash_category_id', $wash_category_id[$i])->where('body_type_id', $body_type_id)->first();
                    if($getPrice != ''){
                        $amount = $amount + $getPrice->price;
                        $wash_type_price = $getPrice->price;
                    } else {
                        $amount = $amount + 0;
                        $wash_type_price = 0;
                    }
                }

                $assignWashType = WashTypeToWash::create([
                        'wash_id'=> $wash_id,
                        'wash_type_id'=> $wash_category_id[$i],
                        'price'=> $wash_type_price,
                        'created_at'=>$dt->toDayDateTimeString(),
                        'updated_at'=>$dt->toDayDateTimeString()
                    ]);



            } // foreach ends
        }
        $total_amount = $amount;
        $data->update([
            'amount' => $amount,
            'total_amount' => $total_amount
        ]);
        // exit;

        DB::delete("DELETE FROM `optional_extras` WHERE `wash_id` = " . $wash_id . "");
        if (count($optional_extra) > 0) {
            for ($i = 0; $i < count($optional_extra); $i++) {
                if($optional_extra[$i] != '' && $optional_extra_price[$i] != ''){
                    $total_amount = $total_amount + $optional_extra_price[$i];
                    OptionalExtra::create([
                        'wash_id'=> $wash_id,
                        'optional_extra'=> $optional_extra[$i],
                        'price'=> $optional_extra_price[$i],
                        'created_at'=>$dt->toDayDateTimeString(),
                        'updated_at'=>$dt->toDayDateTimeString()
                    ]);
                }
            }
            $data->total_amount = $total_amount;
            $data->save();
        }

        $data->update([
            'driver_name' => $driver_name,
            'driver_email' => $driver_email,
            'driver_isd_code' => $driver_isd_code,
            'driver_phone' => $driver_phone
        ]);

        if($payment_status == 1){
            $data->update([
                'payment_status' => $payment_status
            ]);    
        }

        $carData = CarOwnerCar::find($car_id);
        $carData->update([
            'car_registration_no' => $car_registration_no,
            'make' => $make
        ]);


        return back()->with('success', 'Carwash record has been updated successfully.')->with('msg_class', 'alert alert-success');
    }

    public function multiDelete(Request $request)
    {
        $delete_ids = $request->delete_ids;
        // echo "<pre>";print_r($delete_ids);exit;
        if($delete_ids != ''){
            $myArray = explode(',', $delete_ids);
            foreach ($myArray as $id) {
                $record = PreBooking::find($id); // fetch the record
                $record->delete();

                $optionalExtra = OptionalExtra::where('prebooking_id', $id);
                $optionalExtra->delete();

                $cleanerWash = CleanerWash::where('prebooking_id', $id);
                $cleanerWash->delete();

                $washTypeToWash = WashTypeToWash::where('prebooking_id', $id);
                $washTypeToWash->delete();

                $washDetail = WashDetail::where('prebooking_id', $id);
                $washDetail->delete();
            }
        }
        return response()->json(['message' => 'Pre-booking records have been deleted successfully', 'status' => 1], 200);
    }


}
