<?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 (handles numbers shared by more than one officer)
    $candidates = User::where('number', $request->number)
        ->where('otp', $request->otp)
        ->get();

    if ($candidates->isEmpty()) {
        return ApiResponse::error('Invalid OTP', 401);
    }

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

    // Shared number -> ask "who are you?" before issuing a token
    if ($candidates->count() > 1) {
        return ApiResponse::success('Multiple officers share this number. Please identify yourself.', [
            'needs_identification' => true,
            'candidates' => $candidates->map(function ($u) {
                return [
                    'user_id'   => $u->id,
                    'name'      => $u->name,
                    'role_name' => SiteStatusHelper::getRoleName($u->role_id),
                    'zone_id'   => $u->zone_id,
                ];
            })->values(),
        ]);
    }

    $user = $first;

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

    $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 identifyAndSetNumber(Request $request)
{
    $validator = Validator::make($request->all(), [
        'user_id'    => 'required|integer|exists:users,id',
        'new_number' => 'required|digits:10',
    ]);
    if ($validator->fails()) {
        return ApiResponse::validationError($validator->errors()->first());
    }

    $taken = User::where('number', $request->new_number)
        ->where('number_confirmed', 1)
        ->where('id', '!=', $request->user_id)
        ->exists();
    if ($taken) {
        return ApiResponse::error('This number is already registered to another user.', 409);
    }

    $user = User::find($request->user_id);
    $user->number           = $request->new_number;
    $user->number_confirmed = 1;
    $user->otp              = null;
    $user->otp_created_at   = null;
    $user->save();

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

    return ApiResponse::success('Number registered. 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,
            );
        }
    }
}
