<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Hash;
use App\Model\User;
use App\Services\OtpService;
use Carbon\Carbon;



class PhoneVerificationController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    private $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

public function submitPhone(Request $request, OtpService $otpService)
{
    $validator = Validator::make($request->all(), [
        'phone'        => 'required',
        'country_code' => 'required',
    ]);

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

    $displayPhone = $request->phone;
    $rawPhone = preg_replace('/\D+/', '', $displayPhone);
    $country_code = $request->country_code;

    if (User::where('mobile', $rawPhone)->exists()) {
        return response()->json([
            'success' => false,
            'phone_modal' => 'enter_phone',
            'message' => 'Phone Number already taken, Try different one.',
        ]);
    }

    // Send OTP
    $result = $otpService->sendOtp($country_code,$rawPhone);

    if ($result['success']) {
        return response()->json([
            'success' => true,
            'phone_modal' => 'verify_phone',
            'message' => 'OTP sent successfully to ' . $displayPhone,
            'data' => [
                'phone'          => $displayPhone,
                'raw_phone'      => $rawPhone,
                'otp'            => $result['otp'], // send OTP only if needed for debugging (not recommended in prod)
            ],
        ]);
    }

    return response()->json([
        'success' => false,
        'phone_modal' => 'enter_phone',
        'message' => $result['plivo_response']['_message'] ?? 'Something went wrong while sending OTP.',
    ]);
}
// public function verifyPhone(Request $request)
// {
//     $validator = Validator::make($request->all(), [
//         'code' => 'required|digits:6',
//         'phone' => 'required',
//         'phone_hash' => 'required',
//         'phone_encrypted' => 'required',
//         'otp' => 'required',
//         'user_id' => 'required|exists:users,id',
//     ]);

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

//     $code = $request->code;

//     // Check OTP match
//     if (!Hash::check($code, $request->otp)) {
//         return response()->json([
//             'success' => false,
//             'message' => 'Incorrect OTP entered.',
//             'phone_modal' => 'verify_phone'
//         ]);
//     }

//     // Decrypt raw phone
//     try {
//         $rawPhone = Crypt::decryptString($request->phone_encrypted);
//     } catch (\Exception $e) {
//         return response()->json([
//             'success' => false,
//             'message' => 'Phone verification failed due to decryption error.',
//         ]);
//     }

//     // Verify decrypted raw phone matches hash
//     if (!Hash::check($rawPhone, $request->phone_hash)) {
//         return response()->json([
//             'success' => false,
//             'message' => 'Phone number verification failed.',
//         ]);
//     }

//     // Save phone & verified timestamp
//     $user = User::find($request->user_id);
//     $user->mobile = $rawPhone;
//     $user->phone_verified_at = Carbon::now();
//     $user->save();

//     return response()->json([
//         'success' => true,
//         'message' => 'Phone number verified and saved successfully.',
//     ]);
// }
public function verifyPhone(Request $request)
{
    $validator = Validator::make($request->all(), [
        'code' => 'required|digits:6',
        'phone' => 'required',
        'phone_hash' => 'required',
        'otp' => 'required',
        'user_id' => 'required|exists:users,id',
    ]);

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

    // Check OTP match
    if (!Hash::check($request->code, $request->otp)) {
        return response()->json([
            'success' => false,
            'message' => 'Incorrect OTP entered.',
            'phone_modal' => 'verify_phone'
        ]);
    }

    // Verify phone hash
    if (!Hash::check($request->phone, $request->phone_hash)) {
        return response()->json([
            'success' => false,
            'message' => 'Phone number verification failed.',
        ]);
    }

    // Save phone & verified timestamp
    $user = User::find($request->user_id);
    $user->mobile = preg_replace('/\D+/', '', $request->phone); // clean number
    $user->phone_verified_at = Carbon::now();
    $user->save();

    return response()->json([
        'success' => true,
        'message' => 'Phone number verified and saved successfully.',
    ]);
}

}
