<?php

namespace App\Http\Controllers\OwnerPanel;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\CarOwner;
use App\Models\ClientType;
use App\Models\CwoClient;
use App\Models\CarOwnerCar;
use Carbon\Carbon;
use Illuminate\Support\Facades\Hash;
use DB;
use Auth;
use Illuminate\Validation\Rule;

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

    public function index(Request $request)
    {
        $dataBag['chMenu'] = '';
        $cwo_id = Auth::user()->cwo_id;
        // $search = $request->input('search');
        $client_type_id = $request->input('client_type_id');
        $name = $request->input('name');
        $email = $request->input('email');
        $phone = $request->input('phone');
        $account_no = $request->input('account_no');

        $data = CarOwner::with('clientType')
        ->select('co_master.account_no','co_master.co_fname','co_master.co_lname','co_master.isd_code','co_master.co_phone','co_master.email','co_master.is_active','co_master.client_type_id','co_master.id')
                ->join('users','users.id','=','co_master.user_id')
                ->join('cwo_clients','cwo_clients.client_id','=','co_master.id')
                ->where('cwo_clients.cwo_id', $cwo_id);
        // if($search != '') {
        //     $data->where('co_master.co_fname', 'LIKE', $search)
        //             ->orWhere('co_master.co_lname', 'LIKE', $search)
        //             ->orWhere('co_master.co_phone', 'LIKE', $search)
        //             ->orWhere('co_master.account_no', 'LIKE', $search)
        //             ->orWhere('co_master.email', 'LIKE', $search);
        // }
        if($client_type_id != ''){
            $data->where('co_master.client_type_id', $client_type_id);
        }
        if($name != ''){
            $data->where('co_master.co_fname', $name);
        }
        if($email != ''){
            $data->where('co_master.email', $email);
        }
        if($phone != ''){
            $phone_1 = substr($phone, 1);
            // $data->where('co_master.co_phone', $phone);
            $data->where(function ($query) use ($phone, $phone_1) {
                $query->where('co_master.co_phone', $phone)
                    ->orWhere('co_master.co_phone', $phone_1);
            });
        }
        if($account_no != ''){
            $data->where('co_master.account_no', $account_no);
        }
        $data = $data->orderBy('co_master.id', 'desc');
        $dataCnt = $data->count();
        $data = $data->paginate(10);
        $dataBag['allRecords'] = $dataCnt;
        $dataBag['records'] = $data;
        // echo "<pre>";print_r($dataBag['records']->toArray());exit;
        $dataBag['clientTypes'] = ClientType::where('is_active', 1)->orderBy('client_type', 'asc')->get();
        return view('owner.carwashclient.list', $dataBag);
    }

    public function create(Request $request)
    {
        $dataBag = array();
        $dataBag['chMenu'] = '';
        $dataBag['clientTypes'] = ClientType::where('is_active', 1)->orderBy('client_type', 'asc')->get();
        return view('owner.carwashclient.create', $dataBag);
    }

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'email' => 'required|email|unique:co_master,email',
            // 'email' => 'required|email',
            'is_active' => 'required',
            'client_type_id' => 'required',
            'company_name' => [
                Rule::when($request->input('client_type_id') == 3, 'required')
            ],
            'password' => [
                'required',
                // 'string',
                // 'min:6',             // must be at least 6 characters in length
                // 'regex:/[a-z]/',      // must contain at least one lowercase letter
                // 'regex:/[A-Z]/',      // must contain at least one uppercase letter
                // 'regex:/[0-9]/',      // must contain at least one digit
                // 'regex:/[!@#$%^&*()]/', // must contain a special character
            ]
        ], [
            'name.required' => 'Please enter a name.',
            'email.required' => 'Please enter an email.',
            'email.email' => 'Please enter an email of correct format.',
            // 'email.unique' => 'This Email-id already exist, Try Another.',
            'is_active.required' => 'Please select a status.',
            'client_type_id.required' => 'Please select a client type.',
            'password.required' => 'Please enter a password.',
            // 'password.regex' => 'Password must contain atleast one lowercase letter, one uppercase letter, one digit & a special character.',
            // 'phone.numeric' => 'Phoneno. should be numeric.',
        ]);
        $cwo_id = Auth::user()->cwo_id;
        $name = $request->input('name');
        $email = $request->input('email');
        $isd_code = $request->input('isd_code');
        $phone = $request->input('phone');
        $is_active = $request->input('is_active');
        $password = Hash::make($request->input('password'));
        $client_type_id = $request->input('client_type_id');
        // $loyalty_program_eligibility = $request->input('loyalty_program_eligibility');
        $loyalty_program_eligibility = $request->input('loyalty_program_eligibility');
        // echo $loyalty_program_eligibility;exit;
        if($loyalty_program_eligibility == "on") {
            $loyalty_program_eligibility = 1;
        } else {
            $loyalty_program_eligibility = 0;
        }
        // echo $loyalty_program_eligibility;exit;
        $discount = $request->input('discount');
        if($discount == '') {
            $discount = 0;
        }
        $company_name = $request->input('company_name');
        $company_reg_no = $request->input('company_reg_no');
        $contact_isd = $request->input('contact_isd');
        $contact_no = $request->input('contact_no');
        $contact_person = $request->input('contact_person');
        $contact_email = $request->input('contact_email');
        $dt = Carbon::now();
        $account_no = generateUniqueNumberCo();
        /*insert into users table starts*/
        $record = User::create([
            'name' => $name,
            'email' => $email,
            'password' => $password,
            'user_type' => 3,
            'is_active' => $is_active,
            'phone' => $phone,
            'isd_code' => $isd_code,
            'created_at' => $dt->toDayDateTimeString(),
            'updated_at' => $dt->toDayDateTimeString()
        ]);
        /*insert into users table ends*/

        /*insert into co_master table starts*/
        $recordCo = CarOwner::create([
            'account_no' => $account_no,
            'co_fname' => $name,
            'isd_code' => $isd_code,
            'co_phone'  => $phone,
            'email' => $email,
            'is_active' => $is_active,
            'user_id'=> $record->id,
            'client_type_id' => $client_type_id,
            'loyalty_program_eligibility' => $loyalty_program_eligibility,
            'discount' => $discount,
            'company_name' => $company_name,
            'company_reg_no' => $company_reg_no,
            'contact_isd' => $contact_isd,
            'contact_no' => $contact_no,
            'contact_person' => $contact_person,
            'contact_email' => $contact_email,
            'created_at' => $dt->toDayDateTimeString(),
            'updated_at' => $dt->toDayDateTimeString()
        ]);
        /*insert into co_master table ends*/

        $getCwoClient = CwoClient::where('cwo_id', $cwo_id)->where('client_id', $recordCo->id)->first();
        if($getCwoClient == '') {
            /*insert into cwo_clients table starts*/
            $recordCo = CwoClient::create([
                'cwo_id' => $cwo_id,
                'client_id' => $recordCo->id,
                'created_at' => $dt->toDayDateTimeString(),
                'updated_at' => $dt->toDayDateTimeString()
            ]);
            /*insert into cwo_clients table ends*/    
        }

        return back()->with('success', 'User has been added successfully.')->with('msg_class', 'alert alert-success');
    }

    public function edit($id)
    {
        // echo $cwoid . " - " . $cwoid;exit;
        $dataBag = array();
        $dataBag['chMenu'] = '';

        $record = CarOwner::findorfail($id);
        $dataBag['details'] = $record;
        $dataBag['userDetails'] = User::findorfail($record->user_id);
        $dataBag['clientTypes'] = ClientType::where('is_active', 1)->orderBy('client_type', 'asc')->get();
        return view('owner.carwashclient.edit', $dataBag);
    }

    public function update(Request $request, $id)
    {
        $request->validate([
            'name' => 'required',
            'email' => 'required|email|unique:co_master,email,' . $id,
            // 'email' => 'required|email',
            'is_active' => 'required',
            'client_type_id' => 'required',
            'company_name' => [
                Rule::when($request->input('client_type_id') == 3, 'required')
            ],
            // 'password' => [
            //     'required',
            //     // 'string',
            //     // 'min:6',             // must be at least 6 characters in length
            //     // 'regex:/[a-z]/',      // must contain at least one lowercase letter
            //     // 'regex:/[A-Z]/',      // must contain at least one uppercase letter
            //     // 'regex:/[0-9]/',      // must contain at least one digit
            //     // 'regex:/[!@#$%^&*()]/', // must contain a special character
            // ]
        ], [
            'name.required' => 'Please enter a name.',
            'email.required' => 'Please enter an email.',
            'email.email' => 'Please enter an email of correct format.',
            // 'email.unique' => 'This Email-id already exist, Try Another.',
            'is_active.required' => 'Please select a status.',
            'client_type_id.required' => 'Please select a client type.',
            'password.required' => 'Please enter a password.',
            // 'password.regex' => 'Password must contain atleast one lowercase letter, one uppercase letter, one digit & a special character.',
            // 'phone.numeric' => 'Phoneno. should be numeric.',
        ]);
        $cwo_id = Auth::user()->cwo_id;
        $name = $request->input('name');
        $email = $request->input('email');
        $isd_code = $request->input('isd_code');
        $phone = $request->input('phone');
        $is_active = $request->input('is_active');
        if($request->input('password') != ''){
            $password = Hash::make($request->input('password'));
        }
        $client_type_id = $request->input('client_type_id');
        // $loyalty_program_eligibility = $request->input('loyalty_program_eligibility');
        $loyalty_program_eligibility = $request->input('loyalty_program_eligibility');
        // echo $loyalty_program_eligibility;exit;
        if($loyalty_program_eligibility == "on") {
            $loyalty_program_eligibility = 1;
        } else {
            $loyalty_program_eligibility = 0;
        }
        // echo $loyalty_program_eligibility;exit;
        $discount = $request->input('discount');
        if($discount == '') {
            $discount = 0;
        }
        $company_name = $request->input('company_name');
        $company_reg_no = $request->input('company_reg_no');
        $contact_isd = $request->input('contact_isd');
        $contact_no = $request->input('contact_no');
        $contact_person = $request->input('contact_person');
        $contact_email = $request->input('contact_email');
        $dt = Carbon::now();

        /*update users table starts*/
        $data = CarOwner::findOrFail($id);
        $user_id = $data->user_id;
        $userDetail = User::findOrFail($user_id);

        $data->update([
            'co_fname' => $name,
            'isd_code' => $isd_code,
            'co_phone'  => $phone,
            'email' => $email,
            'is_active' => $is_active,
            'client_type_id' => $client_type_id,
            'loyalty_program_eligibility' => $loyalty_program_eligibility,
            'discount' => $discount,
            'company_name' => $company_name,
            'company_reg_no' => $company_reg_no,
            'contact_isd' => $contact_isd,
            'contact_no' => $contact_no,
            'contact_person' => $contact_person,
            'contact_email' => $contact_email,
            'updated_at' => $dt->toDayDateTimeString()
        ]);

        if ($request->input('password') != '') {
            $password = Hash::make($request->input('password'));
            $record = $userDetail->update([
                'name' => $name,
                'email' => $email,
                'password' => $password,
                'is_active' => $is_active,
                'phone' => $phone,
                'isd_code' => $isd_code,
                'updated_at' => $dt->toDayDateTimeString()
            ]);
        } else {
            $record = $userDetail->update([
                'name' => $name,
                'email' => $email,
                'is_active' => $is_active,
                'phone' => $phone,
                'isd_code' => $isd_code,
                'updated_at' => $dt->toDayDateTimeString()
            ]);
        }
        /*update users table ends*/

        $getCwoClient = CwoClient::where('cwo_id', $cwo_id)->where('client_id', $id)->first();
        if($getCwoClient == '') {
            /*insert into cwo_clients table starts*/
            $recordCo = CwoClient::create([
                'cwo_id' => $cwo_id,
                'client_id' => $id,
                'created_at' => $dt->toDayDateTimeString(),
                'updated_at' => $dt->toDayDateTimeString()
            ]);
            /*insert into cwo_clients table ends*/    
        }

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

    public function destroy(Request $request)
    {
        //
        $id = $request->id;
        // dd($id);

        $carCount = CarOwnerCar::where('co_id', $id)->count();
        if($carCount > 0){
            return response()->json(['message' => 'This Car Owner has cars associated with it. You can not delete it.', 'status' => 2], 200);    
        }

        $item = CarOwner::find($id);
        $user_id = $item->user_id;
        $item->delete();
        $record = User::findorfail($user_id); // fetch the record
        $record->delete();
        
        return response()->json(['message' => 'User deleted successfully', 'status' => 1], 200);
    }

    public function delete($id)
    {
        $record = User::findorfail($userid); // fetch the record
        // $record->is_active = "0";
        $record->delete();
        // $record->save();
        return back()->with('msg', 'User has been deleted successfully.')
            ->with('msg_class', 'alert alert-success');
    }

    public function status_change_ajax(Request $request)
    {
        try {
            $user_data = CarOwner::where('id', $request->id)->first();
            if ($user_data != null) {
                $user_data->is_active = $request->status;
                $user_data->save();

                $co_user = User::where('id', $user_data->user_id)->first();
                if ($co_user != null) {
                    $co_user->is_active = $request->status;
                    $co_user->save();
                }

                return response()->json(['message' => 'User status changed successfully', 'status' => 1], 200);
            } else {
                return response()->json(['message' => 'User not found', 'status' => 0], 401);
            }
        } catch (exception $e) {
        }
    }
    public function download(Request $request)
    {
        $fileName = 'car-wash-clients.csv';

        $cwo_id = Auth::user()->cwo_id;
        // $search = $request->input('search');
        $client_type_id = $request->input('client_type_id');
        $name = $request->input('name');
        $email = $request->input('email');
        $phone = $request->input('phone');
        $account_no = $request->input('account_no');

        $data = CarOwner::with('clientType')
        ->select('co_master.account_no','co_master.co_fname','co_master.co_lname','co_master.isd_code','co_master.co_phone','co_master.email','co_master.is_active','co_master.client_type_id','co_master.id','co_master.loyalty_program_eligibility','co_master.discount','co_master.company_name','co_master.company_reg_no','co_master.contact_no','co_master.contact_person','co_master.contact_email')
                ->join('users','users.id','=','co_master.user_id')
                ->join('cwo_clients','cwo_clients.client_id','=','co_master.id')
                ->where('cwo_clients.cwo_id', $cwo_id);
        // if($search != '') {
        //     $data->where('co_master.co_fname', 'LIKE', $search)
        //             ->orWhere('co_master.co_lname', 'LIKE', $search)
        //             ->orWhere('co_master.co_phone', 'LIKE', $search)
        //             ->orWhere('co_master.account_no', 'LIKE', $search)
        //             ->orWhere('co_master.email', 'LIKE', $search);
        // }
        if($client_type_id != ''){
            $data->where('co_master.client_type_id', $client_type_id);
        }
        if($name != ''){
            $data->where('co_master.co_fname', $name);
        }
        if($email != ''){
            $data->where('co_master.email', $email);
        }
        if($phone != ''){
            $phone_1 = substr($phone, 1);
            // $data->where('co_master.co_phone', $phone);
            $data->where(function ($query) use ($phone, $phone_1) {
                $query->where('co_master.co_phone', $phone)
                    ->orWhere('co_master.co_phone', $phone_1);
            });
        }
        if($account_no != ''){
            $data->where('co_master.account_no', $account_no);
        }
        $data = $data->orderBy('co_master.id', 'desc');

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

        $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('Account No.', 'Client Type', 'Name', 'Phone', 'Email', 'Eligible for Loyalty Program', 'Disount (%)', 'Company Name', 'Company Registration No.', 'Contact Phone', 'Contact Person', 'Contact Email', 'Status');

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

            foreach ($data as $d) {
                $row['co_name']  = $d->co_fname . ' ' . $d->co_lname;
                if($d->co_phone != ''){
                    $row['co_phone']  = '+' . $d->isd_code . $d->co_phone;
                } else {
                    $row['co_phone']  = '';
                }
                $row['email']  = $d->email;
                if($d->is_active == 1){
                    $row['is_active']  = 'Active';
                } else {
                    $row['is_active']  = 'Inactive';
                }
                $row['account_no']  = $d->account_no;
                $row['client_type']  = $d->clientType->client_type;
                if($d->loyalty_program_eligibility == 1){
                    $row['loyalty_program_eligibility']  = 'Yes';
                } else {
                    $row['loyalty_program_eligibility']  = 'No';
                }
                $row['discount']  = $d->discount;
                $row['company_name']  = $d->company_name;
                $row['company_reg_no']  = $d->company_reg_no;
                $row['contact_no']  = $d->contact_no;
                $row['contact_person']  = $d->contact_person;
                $row['contact_email']  = $d->contact_email;
                

                fputcsv($file, array($row['account_no'], $row['client_type'], $row['co_name'], $row['co_phone'], $row['email'], $row['loyalty_program_eligibility'], $row['discount'], $row['company_name'], $row['company_reg_no'], $row['contact_no'], $row['contact_person'], $row['contact_email'], $row['is_active']));
            }

            fclose($file);
        };

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