<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;

class AuthController extends Controller
{
    public function login(LoginRequest $request)
    {
        try {
            $credentials = $request->validated();

            $vendor = current_vendor();
            if (! $vendor) {
                throw ValidationException::withMessages([
                    'username' => ['کد سازمان را وارد کنید. بعد از نصب تازه معمولاً main یا default است.'],
                ]);
            }

            /** @var User|null $user */
            $user = User::withoutVendorScope()
                ->where('username', $credentials['username'])
                ->where('vendor_id', $vendor->id)
                ->first();

            if (! $user || ! Hash::check($credentials['password'], $user->password)) {
                throw ValidationException::withMessages([
                    'username' => ['نام کاربری یا رمز عبور اشتباه است'],
                ]);
            }

            if (! $user->is_active) {
                throw ValidationException::withMessages([
                    'username' => ['حساب کاربری شما غیرفعال است'],
                ]);
            }

            $token = $user->createToken('api')->plainTextToken;
            $user->load('roles.permissions', 'permissions', 'vendor');

            // سریال‌سازی اینجا انجام شود تا هر خطا در UserResource داخل try گرفته شود
            $userData = (new UserResource($user))->toArray($request);

            return $this->success([
                'token' => $token,
                'user' => $userData,
            ], 'ورود با موفقیت انجام شد');
        } catch (ValidationException $e) {
            throw $e;
        } catch (\Throwable $e) {
            Log::error('Login error', [
                'username' => $request->input('username'),
                'message' => $e->getMessage(),
                'file' => $e->getFile(),
                'line' => $e->getLine(),
                'trace' => $e->getTraceAsString(),
            ]);
            throw ValidationException::withMessages([
                'username' => [config('app.debug') ? $e->getMessage() . ' (در ' . $e->getFile() . ':' . $e->getLine() . ')' : 'خطا در ورود. در فایل storage/logs/laravel.log جزئیات را ببینید.'],
            ]);
        }
    }

    public function logout(Request $request)
    {
        /** @var User $user */
        $user = $request->user();

        $user?->currentAccessToken()?->delete();

        return $this->success(null, 'خروج با موفقیت انجام شد');
    }

    public function user(Request $request)
    {
        $user = $request->user();
        $user->load('roles.permissions', 'permissions', 'vendor');

        return $this->success(new UserResource($user));
    }
}
