<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\CarOwner;
use App\Models\User;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Password;
use Config;
use Hash;
use Auth;

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


    public function index(){
    }

    public function register(Request $request){
        $validate = Validator::make($request->all(), 
            [
                'co_fname' => 'required',
                // 'co_lname' => 'required',
                'isd_code' => 'required',
                'email' => 'required|email|unique:co_master,email',
                'co_phone' => 'required|unique:co_master,co_phone',
                'password' => [
                    'required',
                    // 'confirmed',
                    // 'string',
                    // 'min:8',             // must be at least 8 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
                ],
            ],[
                'email.unique' => 'This email already exists.',
                // 'password.confirmed' => 'The password and confirm password field should be same.'
            ]);
            
        if($validate->fails()){
            $errorString = implode(",",$validate->messages()->all());
            return response()->json([
                'success' => 0,
                // 'message' => $validate->errors(),
                'message' => $errorString,
            ]);
        }

        $co_fname = $request->input('co_fname');
        $co_lname = $request->input('co_lname');
        $isd_code = $request->input('isd_code');
        $co_phone = $request->input('co_phone');
        $email = $request->input('email');
        $password = Hash::make($request->input('password'));
        $dt = Carbon::now(); 
        $account_no = generateUniqueNumberCO();
        $co_image = '';
        if ($request->hasFile('co_image')) {
            $co_image = time() . '.' . $request->file('co_image')->extension();
            $path = $request->file('co_image')->move(public_path('images/co/'), $co_image);
        }

        /*insert into users table starts*/
        $user = User::create([
            'name' => $co_fname . ' ' . $co_lname,
            'isd_code' => $isd_code,
            'phone' => $co_phone,
            'email' => $email,
            'password' => Hash::make($request->password),
            'is_active' => 1,
            'user_type' => 3
        ]);
        /*insert into users table ends*/
        $user_id = $user->id;

        /*insert into co_master table starts*/
        $data = CarOwner::create([
            'account_no'=> $account_no,
            'co_fname'=> $co_fname,
            'co_lname'=> $co_lname,
            'isd_code'=> $isd_code,
            'co_phone'=> $co_phone,
            'email'=> $email,
            'co_image'=> $co_image,
            'user_id'  => $user_id,
            'is_active'=> 1,
            'created_at'=>$dt->toDayDateTimeString(),
            'updated_at'=>$dt->toDayDateTimeString()
        ]);
        /*insert into co_master table ends*/
        $co_id = $data->id;

        return response()->json([
            'success' => 1,
            'message' => 'Success',
            'co_id' => $co_id,
            'co_account_no' => $account_no,
            'user_id' => $user_id
        ]);

    }

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

        $email = $request->input('email');
        $password = $request->input('password');
        $dt = Carbon::now(); 
        $credentials = [
            'email' => $email,
            'password' => $password,
            'user_type' => 3,
        ];
        if(!Auth::guard('web')->attempt($credentials)) {    
            return response()->json([
                'success' => 0,
                'message' => 'Sorry! Email & Password does not match with our record.',
            ]);
        }
        $user = User::where('email', $email)->where('user_type', 3)->first();
        // echo "<pre>";print_r($user->toArray());exit;
        $getCo = CarOwner::where('user_id', $user->id)->first();
        if($getCo->is_active == 0){
            return response()->json([
                'success' => 0,
                'message' => 'Sorry! Your account is not active. Please contact admin.',
            ]);
        }
        $token = '';
        $token = $user->createToken('App User Token');
        $token = $token->plainTextToken;

        /*token create starts*/
        /*$token_email = 'admin@gmail.com';
        $token_password = '123456';
        $credentials = [
            'email' => $token_email,
            'password' => $token_password,
            'user_type' => 1,
        ];  
        if(Auth::attempt($credentials)){
            $tokenUser = User::where('email', $token_email)->first();
            $token = $tokenUser->createToken('App Token');
            $token = $token->plainTextToken;
        } else {
            $token = '';
        }*/
        /*token create ends*/

        if($getCo->co_image != ''){
            $co_image = asset('images/co') . '/' . $getCo->co_image;
        } else {
            $co_image = asset('app-assets/images/logo/logo.png');
        }

        if($getCo->isd_code != ''){
            $isd_code = '+' . $getCo->isd_code;
        } else {
            $isd_code = '+27';
        }

        return response()->json([
            'success' => 1,
            'message' => 'Success',
            'co_id' => $getCo->id,
            'co_image' => $co_image,
            'co_account_no' => $getCo->account_no,
            'user_id' => $user->id,
            'co_fname' => $getCo->co_fname,
            'co_lname' => $getCo->co_lname,
            'email' => $getCo->email,
            'isd_code' => $isd_code,
            'co_phone' => $getCo->co_phone,
            'token' => $token
        ]);

    }

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

        $co_id = $request->input('co_id');
        $getCo = CarOwner::where('id', $co_id)->first();
        if($getCo != ''){
            if($getCo->co_image != ''){
                $co_image = asset('images/co') . '/' . $getCo->co_image;
            } else {
                $co_image = asset('app-assets/images/logo/logo.png');
            }

            if($getCo->isd_code != ''){
                $isd_code = '+' . $getCo->isd_code;
            } else {
                $isd_code = '+27';
            }
            return response()->json([
                'success' => 1,
                'message' => 'Success.',
                'co_id' => $co_id,
                'co_image' => $co_image,
                'co_account_no' => $getCo->account_no,
                'user_id' => $getCo->user_id,
                'co_fname' => $getCo->co_fname,
                'co_lname' => $getCo->co_lname,
                'email' => $getCo->email,
                'isd_code' => $isd_code,
                'co_phone' => $getCo->co_phone,
            ]);    
        } else {
            return response()->json([
                'success' => 0,
                'message' => 'The Car Owner ID does not exist.',
            ]);
        }
    }

    public function update(Request $request){
        $validate = Validator::make($request->all(), 
            [
                'co_id' => 'required',
                'co_fname' => 'required',
                // 'co_lname' => 'required',
                'isd_code' => 'required',
                'co_phone' => 'required',
                'email' => 'required|email|unique:co_master,email,' . $request->input('co_id'),
            ],[
                // 'password.confirmed' => 'The password and confirm password field should be same.'
            ]);
            
        if($validate->fails()){
            $errorString = implode(",",$validate->messages()->all());
            return response()->json([
                'success' => 0,
                // 'message' => $validate->errors(),
                'message' => $errorString,
            ]);
        }

        $co_id = $request->input('co_id');
        $co_fname = $request->input('co_fname');
        $co_lname = $request->input('co_lname');
        $isd_code = $request->input('isd_code');
        $co_phone = $request->input('co_phone');
        $email = $request->input('email');
        $dt = Carbon::now(); 
        
        $item = CarOwner::findOrFail($co_id);
        if($item != '') {
            $co_image = $item->co_image;
            if ($request->hasFile('co_image')) {
                $co_image = time() . '.' . $request->file('co_image')->extension();
                $path = $request->file('co_image')->move(public_path('images/co/'), $co_image);
            }
            $data = [
                'co_fname' => $co_fname,
                'co_lname' => $co_lname,
                'co_phone' => $co_phone,
                'email' => $email,
                'co_image' => $co_image,
                'isd_code' => $isd_code,
                'updated_at'=>$dt->toDayDateTimeString()
            ];
            $item->update($data);

            $user_id = $item->user_id;
            $userDetail = User::findOrFail($user_id);
            $user_data = [
                    'name' => $co_fname . ' ' . $co_lname,
                    'email' => $email,
                    'phone' => $co_phone,
                    'isd_code' => $isd_code,
                    'updated_at'=>$dt->toDayDateTimeString()
                ];
            $userDetail->update($user_data);  
            return response()->json([
                'success' => 1,
                'message' =>  $data
            ]);
        } else {
            return response()->json([
                    'success' => 0,
                    'message' => 'This car owner ID does not exist in the system.',
                ]);
        } 

    }

    public function changePassword(Request $request){
        $validate = Validator::make(
            $request->all(),
            [
                'co_id' => 'required',
                'old_password' => 'required',
                // 'new_password' => 'required|confirmed',
                'new_password' => 'required',
                // 'new_password' => [
                //             'required',
                //             'confirmed',
                //             'string',
                //             'min:8',             // must be at least 8 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
                //         ],
            ],
            [
                'co_id.required' => 'Please enter co ID.',
                'old_password.required' => 'Please enter a old password.',
                'new_password.required' => 'Please enter a new password.',
                // 'new_password.confirmed' => 'New Password and Confirm New Password should be same.',
                // 'new_password.regex' => 'Password must contain atleast one lowercase letter, one uppercase letter, one digit & a special character.'
            ]
        );

        if($validate->fails()) {
            $errorString = implode(",", $validate->messages()->all());
            return response()->json([
                'success' => 0,
                // 'message' => $validate->errors(),
                'message' => $errorString,
            ]);
        }

        $co_id = $request->input('co_id');
        $old_password = $request->input('old_password');
        $new_password = $request->input('new_password');

        $item = CarOwner::findOrFail($co_id);
        $user_id = $item->user_id;

        $record = User::findorfail($user_id);

        #Match The Old Password
        if(!Hash::check($old_password, $record->password)) {
            return response()->json([
                'success' => 0,
                'message' => 'Old password does not match.',
            ]);
        }
        // exit;

        #Update the new Password
        User::whereId($user_id)->update([
            'password' => Hash::make($new_password)
        ]);

        return response()->json([
            'success' => 1,
            'message' => 'Success'
        ]);

    }

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

        $email = $request->input('email');
        $status = Password::sendResetLink(
            $request->only('email')
        );
        if($status == Password::RESET_LINK_SENT){
            return response()->json([
                'success' => 1,
                'message' => __($status) . __(' Please check your email.'),
            ]);
        }else{
             return response()->json([
                'success' => 0,
                'message' => __($status),
            ]);
        }
    }

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

        $co_id = $request->input('co_id');
        $fcm_token = $request->input('fcm_token');
        $dt = Carbon::now();

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

}
