<?php

namespace App\Livewire\Auth;

use App\Domain\Identity\Services\AuthService;
use App\Domain\Identity\Services\LoginRedirectService;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;

#[Layout('layouts.guest')]
#[Title('تسجيل الدخول')]
class Login extends Component
{
    public string $identifier = '';
    public string $password = '';
    public bool $remember = false;
    public ?string $errorMessage = null;

    public function rules(): array
    {
        return [
            'identifier' => 'required|string|min:3',
            'password' => 'required|min:6',
        ];
    }

    public function messages(): array
    {
        return [
            'identifier.required' => 'البريد الإلكتروني أو رقم الهاتف مطلوب',
            'identifier.min' => 'يجب أن يكون الإدخال 3 أحرف على الأقل',
            'password.required' => 'كلمة المرور مطلوبة',
            'password.min' => 'كلمة المرور يجب أن تكون 6 أحرف على الأقل',
        ];
    }

    public function login(AuthService $authService): void
    {
        $this->validate();
        $this->errorMessage = null;

        $result = $authService->attempt(
            identifier: $this->identifier,
            password: $this->password,
            ip: request()->ip(),
            userAgent: request()->userAgent(),
        );

        if (!$result->success) {
            if ($result->minutesRemaining) {
                $this->errorMessage = "تم قفل الحساب لمدة {$result->minutesRemaining} دقيقة بسبب محاولات تسجيل دخول متعددة فاشلة";
            } elseif ($result->reason === 'inactive') {
                $this->errorMessage = 'الحساب غير نشط. تواصل مع الإدارة.';
            } else {
                $this->errorMessage = 'بيانات الدخول غير صحيحة';
            }
            return;
        }

        Auth::login($result->user, $this->remember);
        session()->regenerate();

        // Seed the branch for the new session here rather than in a service —
        // LoginRedirectService must stay free of session/auth so it remains
        // callable outside a request.
        $branch = app(\App\Domain\Shared\Context\BranchContext::class);
        $branch->clear();
        $branch->resolveForUser($result->user);

        $defaultRoute = $branch->isLocked()
            ? $branch->redirectRouteName()
            : app(LoginRedirectService::class)->getRedirectRoute($result->user);

        $this->redirectIntended(route($defaultRoute));
    }

    public function render()
    {
        return view('livewire.auth.login');
    }
}
