<?php

namespace App\Http\Controllers\api;
use App\Helpers\SiteStatusHelper;
use DB;
use App\Http\Controllers\Controller;
use App\Http\Responses\ApiResponse;
use App\Models\User;
use App\Services\SmsService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Log;

class LoginController extends Controller
{

protected SmsService $smsService;

    public function __construct(SmsService $smsService)
    {
        $this->smsService = $smsService;
    }

    public function login(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'number' => 'required|digits:10'
        ]);

        if ($validator->fails()) {
            return ApiResponse::validationError($validator->errors()->first());
        }

        $user = User::where('number', $request->number)
                    ->where('status', 1)
                    ->first();

        if (!$user) {
            return ApiResponse::error('User not found', 404);
        }

       //  $otp = rand(100000, 999999);
        $otp = 123456;
        $user->update([
            'otp' => $otp, 
            'otp_created_at'=>Carbon::now(),
        ]);

       //$sent = $this->smsService->sendOtp($user->number, $otp);

       $sent=true;


        if (!$sent) {
            return ApiResponse::error('OTP sending failed', 500);
        }

        return ApiResponse::success('OTP sent successfully');
    }


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

//     if ($validator->fails()) {
//         return ApiResponse::validationError(
//             $validator->errors()->first()
//         );
//     }

//     $user = User::where('number', $request->number)
//         ->where('otp', $request->otp)
//         ->first();

//     if (!$user) {
//         return ApiResponse::error('Invalid OTP', 401);
//     }

//     if ($user->otp_created_at && $user->otp_created_at->diffInMinutes(now()) > 5) {
//         return ApiResponse::error('OTP expired', 401);
//     }

//     $user->update([
//         'otp' => null,
//         'otp_created_at' => null
//     ]);

//     Auth::login($user);

//     $token = $user->createToken('auth_token')->plainTextToken;

//     return ApiResponse::success('Login successful', [
//         'token' => $token,
//         'user'  => $user
//     ]);
// }

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

    if ($validator->fails()) {
        return ApiResponse::validationError(
            $validator->errors()->first()
        );
    }

    // ✅ Fixed OTP case (only for this number)
    if ($request->number == '7704079241' && $request->otp == '123456') {
        $user = User::where('number', $request->number)->first();

        if (!$user) {
            return ApiResponse::error('User not found', 404);
        }

        Auth::login($user);
        $token = $user->createToken('auth_token')->plainTextToken;

        SiteStatusHelper::auditLog(
            'Action to login ',
            'login',               
            $user->id,             
            null,                  
            $user->toArray()     
        );

        return ApiResponse::success('Login successful (fixed OTP)', [
            'token' => $token,
            'user'  => $user,
            'role_name'=>SiteStatusHelper::getRoleName($user->role_id),
        ]);
    }



    // 🔁 Normal OTP flow
    $user = User::where('number', $request->number)
        ->where('otp', $request->otp)
        ->first();

             SiteStatusHelper::auditLog(
            'Action to login ',
            'login',               
            $user->id,             
            null,                  
            $user->toArray()     
        );

    if (!$user) {
        return ApiResponse::error('Invalid OTP', 401);
    }

    if ($user->otp_created_at && $user->otp_created_at->diffInMinutes(now()) > 5) {
        return ApiResponse::error('OTP expired', 401);
    }

    $user->update([
        'otp' => null,
        'otp_created_at' => null
    ]);

    Auth::login($user);

    $token = $user->createToken('auth_token')->plainTextToken;

    return ApiResponse::success('Login successful', [
        'token' => $token,
        'user'  => $user,
        'role_name'=>SiteStatusHelper::getRoleName($user->role_id),
    ]);
}

public function verifyOtp_oldd(Request $request) {

    $validator = Validator::make($request->all(), [
        'number' => 'required|digits:10',
        'otp'    => 'required|digits:6'
    ]);

    if ($validator->fails()) {
        return ApiResponse::validationError(
            $validator->errors()->first()
        );
    }

    // Static OTP check
    if ($request->otp != '123456') {
        return ApiResponse::error('Invalid OTP', 401);
    }

    // Only check user by number
    $user = User::where('number', $request->number)->first();

    if (!$user) {
        return ApiResponse::error('User not found', 404);
    }

    // Optional: skip expiry OR keep it
    // if ($user->otp_created_at && $user->otp_created_at->diffInMinutes(now()) > 5) {
    //     return ApiResponse::error('OTP expired', 401);
    // }

    // Clear OTP fields (optional now)
    // $user->update([
    //     'otp' => null,
    //     'otp_created_at' => null
    // ]);

    Auth::login($user);

    $token = $user->createToken('auth_token')->plainTextToken;

    return ApiResponse::success('Login successful', [
        'token' => $token,
        'user'  => $user
    ]);
}


public function sms(){
dd("lokesh");
}


 // LOGOUT
    public function logout(Request $request)
    {
        try {
            $user = $request->user();

            if (!$user || !$user->currentAccessToken()) {
                return response()->json(
                    [
                        'status' => false,
                        'message' => 'Unauthenticated',
                    ],
                    401,
                );
            }

            // ✅ Delete current token only
            $user->currentAccessToken()->delete();

            return response()->json(
                [
                    'status' => true,
                    'message' => 'Logged out successfully',
                ],
                200,
            );
        } catch (\Throwable $e) {
            Log::error('Logout failed', [
                'user_id' => optional($request->user())->id,
                'error' => $e->getMessage(),
            ]);

            return response()->json(
                [
                    'status' => false,
                    'message' => 'Something went wrong. Please try again later.',
                ],
                500,
            );
        }
    }
}
