<?php

namespace App\Http\Controllers;

use App\Model\User;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Log;
use Carbon\Carbon;
use App\Mail\OtpMail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use PragmaRX\Google2FAQRCode\Google2FA;
class ProfileController extends Controller {

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    private $request;

    public function __construct(Request $request, User $user) {
        $this->request = $request;
        $this->model = $user;
    }
    
    /**
    * Get user id
    * Used in ivr mesu add / edit page
    * @return type
    */
 public function updateGoogleAuthenticator(Request $request)
{
    try {
        Log::info('Reached updateGoogleAuthenticator function', [
            $request->all()
        ]);

        $user = User::findOrFail($request->user()->id);

        if ((int)$request->allow_google_authenticator === 1) {
            // Generate or use existing secret key
            if (is_null($user->google2fa_secret)) {
                $google2fa = new Google2FA();
                $secretKey = $google2fa->generateSecretKey();
                $user->google2fa_secret = $secretKey;
                $user->save();
            }

            // Generate QR code
       $google2fa = new Google2FA();

        $qrImage = $google2fa->getQRCodeInline(
            config('app.name', 'Phonify'),
            $user->email,
            $user->google2fa_secret
        );


            return response()->json([
                'success' => true,
                'message' => 'Please scan the QR code to enable Google Authenticator.',
                'show' => 1,
                'qr_code' => $qrImage,
                'email' => $user->email
            ]);
        }

        // Update Google Authenticator status
        $user->allow_google_authenticator = $request->allow_google_authenticator;
        $user->save();

        return response()->json([
            'success' => true,
            'message' => 'Google Authenticator updated successfully.',
            'show' => 0
        ]);
    } catch (\Exception $e) {
        Log::error('Error updating Google Authenticator', [
            'error' => $e->getMessage(),
            'user_id' => $request->user()->id ?? null
        ]);
        return response()->json([
            'success' => false,
            'message' => 'An error occurred while updating Google Authenticator.'
        ], 500);
    }
}
//      public function verifyGoogleAuthenticator(Request $request)
// {
//     Log::info('Reached verifyGoogleAuthenticator function', [
//         'user_id' => $request->user()->id ?? null
//     ]);

//     $user_id = $request->user()->id;

//     try {
//         // Build OTP from inputs
//         $otp = trim(
//             $request->input('digit1') .
//             $request->input('digit2') .
//             $request->input('digit3') .
//             $request->input('digit4') .
//             $request->input('digit5') .
//             $request->input('digit6')
//         );

//         Log::info('Received OTP', ['otp' => $otp]);

//         // Validate format
//         if (!preg_match('/^\d{6}$/', $otp)) {
//             return response()->json([
//                 'success' => false,
//                 'message' => 'OTP must be a 6-digit number.'
//             ], 400);
//         }

//         // Find user
//         $user = User::findOrFail($user_id);
//         Log::info('User found', ['user' => $user->id]);

//         // Ensure secret exists
//         if (is_null($user->google2fa_secret)) {
//             return response()->json([
//                 'success' => false,
//                 'message' => 'Google Authenticator setup is incomplete. Please try enabling again.'
//             ], 400);
//         }

//         // Verify OTP with tolerance
//         $google2fa = new Google2FA();
//         $isValid = $google2fa->verifyKey($user->google2fa_secret, $otp, 4);

//         Log::info('OTP validation result', ['isValid' => $isValid]);

//         if ($isValid) {
//             $user->allow_google_authenticator = 1;
//             $user->google_auth_verifyAt =Carbon::now();
//             $user->save();

//             return response()->json([
//                 'success' => true,
//                 'message' => 'Google Authenticator verified successfully.'
//             ]);
//         }

//      else {
//         return response()->json([
//             'success' => false,
//             'message' => 'Invalid OTP. Please try again.'
//         ], 401);
//     }
//     } catch (\Exception $e) {
    
//     }
// }


public function verifyGoogleAuthenticator(Request $request)
{
    Log::info('Reached verifyGoogleAuthenticator function', [
        'user_id' => $request->user()->id ?? null
    ]);

    $user_id = $request->user()->id;

    try {
        // Build OTP from inputs
        $otp = trim(
            $request->input('digit1') .
            $request->input('digit2') .
            $request->input('digit3') .
            $request->input('digit4') .
            $request->input('digit5') .
            $request->input('digit6')
        );

        Log::info('Received OTP', ['otp' => $otp]);

        // Validate format
        if (!preg_match('/^\d{6}$/', $otp)) {
            return response()->json([
                'success' => false,
                'message' => 'OTP must be a 6-digit number.'
            ], 400);
        }

        // Find user
        $user = User::findOrFail($user_id);
        Log::info('User found', ['user' => $user->id]);

        // Ensure secret exists
        if (is_null($user->google2fa_secret)) {
            return response()->json([
                'success' => false,
                'message' => 'Google Authenticator setup is incomplete. Please try enabling again.'
            ], 400);
        }

        // Correct init from Laravel container
        $google2fa = new Google2FA();
        // Debug: get expected OTP for current window
        $expectedOtp = $google2fa->getCurrentOtp($user->google2fa_secret);
        Log::info('Expected OTP', ['expected' => $expectedOtp]);

        // Verify OTP with small tolerance (±1 window = 30s drift)
        $isValid = $google2fa->verifyKey($user->google2fa_secret, $otp, 1);

        Log::info('OTP validation result', ['isValid' => $isValid]);

        if ($isValid) {
            $user->allow_google_authenticator = 1;
            $user->google_auth_verify_at = Carbon::now();
            $user->save();

            return response()->json([
                'success' => true,
                'message' => 'Google Authenticator verified successfully.'
            ]);
        }

        return response()->json([
            'success' => false,
            'message' => 'Invalid OTP. Please try again.'
        ], 401);

    } catch (\Exception $e) {
        Log::error('Error in verifyGoogleAuthenticator', [
            'error' => $e->getMessage()
        ]);
        return response()->json([
            'success' => false,
            'message' => 'Something went wrong while verifying OTP.'
        ], 500);
    }
}

      public function updateTwoFactor(Request $request)
    {

        $user_id = $request->user()->id;

        $user = User::findOrFail($user_id);
        Log::info('user', ['user' => $user->mobile]);

        if ($user->mobile) {
            $user->enable_2fa = $request->allow_two_factor_status;
            $user->save();
            $status = $user->enable_2fa ? "Enabled" : "Disabled";
            return response()->json(['success' => true, 'message' => 'Two Factor ' . $status . ' successfully.']);
        } else {
            return response()->json(['error' => true, 'message' => 'To enable Two Factor, First Add Phone Number.', 'modal' => 'show']);
        }
    }
   
      public function changeEmail(Request $request)
    {
            $user_id = $request->user()->id;
            $user = User::findOrFail($user_id);

        $validator = Validator::make($request->all(), [
            'new_email' => [
                'required',
                'email',
                'max:255',
                'unique:users,email',
                function ($attribute, $value, $fail) use ($user) {
                    if ($value === $user->email) {
                        $fail('The new email cannot be the same as your current email.');
                    }
                },
            ],
        ]);

    if ($validator->fails()) {
    return response()->json([
        'success' => false,
        'message' => 'Validation failed',
        'errors'  => $validator->errors(),
        'modal'   => 'change_email',
    ], 422);
}

        // $otp = mt_rand(100000, 999999);
        $otp = '123456';

 

        Mail::to($request->new_email)->send(new OtpMail($otp));
return response()->json([
    'success' => true,
    'message' => 'OTP sent to your new email address.',
    'otp' => Hash::make($otp),   // ✅ store hash
]);
    }

public function verifyOtp(Request $request)
{
    $validator = Validator::make($request->all(), [
        'otp' => ['required', 'digits:6'],
    ]);

    if ($validator->fails()) {
        return response()->json([
            'success' => false,
            'message' => $validator->errors()->first(),
            'modal'   => 'verify_otp',
        ], 422);
    }

    $emailChangeData = $request->input('email_change'); // ✅ correct way

    if (!$emailChangeData || Carbon::now()->timestamp > $emailChangeData['expires_at']) {
        return response()->json([
            'success' => false,
            'message' => 'The OTP has expired. Please try again.',
            'modal'   => 'change_email'
        ], 400);
    }

    if (!Hash::check($request->otp, $emailChangeData['otp'])) { // ✅ use array index
        return response()->json([
            'success' => false,
            'message' => 'Invalid OTP. Please try again.',
            'modal'   => 'verify_otp'
        ], 400);
    }

    $user = $request->user();
    $user->email = $emailChangeData['new_email'];
    $user->email_verified_at = Carbon::now();
    $user->save();

    return response()->json([
        'success' => true,
        'message' => 'Email updated successfully.',
    ], 200);
}
 public function updateImage(Request $request)
    {
   

        // (Optional) validate token here before proceeding

        $user = User::find($request->id);

        if (!$user) {
            return response()->json([
                'success' => false,
                'message' => 'User not found.',
            ], 404);
        }

        $user->profile_pic = $request->image;
        $user->save();

        return response()->json([
            'success' => true,
            'message' => 'Profile image updated successfully.',
            'image'   => $user->profile_pic,
        ]);
    }
}
