<?php

namespace App\Domains\UserManagement\Controllers;

use App\Enumerations\UserRole;
use App\Providers\InertiaProvider;
use App\Scopes\CommonController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LoginController extends CommonController {
    public function loginForm(Request $request) {
        $errors = [];

        if ($request->session()->has('errors')) {
            $errors = $request->session()->get('errors')->getBag('default')->getMessages();
        }


        $inertiaProvider = new InertiaProvider('UserManagement/Login', ['errors' => $errors, 'appName' => app('tenant')->name]);
        return $inertiaProvider->render();
    }

    public function doLogin(Request $request)
    {

        $credentials = $request->validate([
            'username' => ['required', 'string'],
            'password' => ['required'],
        ],
        [
            'username.required' => 'Bitte gib deinen Anmeldenamen ein.',
            'username.string' => 'Der Anmeldename muss eine E-Mail-Adresse sein.',
            'password.required' => 'Bitte gib dein Passwort ein.',
        ]);

        $user = $this->users->findByUsername($request->input('username'));
        if ($user !== null && $user->password === null) {
            return redirect()->intended('/register/verifyEmail');
        }

        if (!Auth::attempt($credentials)) {
            return back()->withErrors([
                'username' => 'Diese Zugangsdaten sind ungültig.',
            ]);
        }

        $user = Auth::user();
        $tenant = app('tenant');

        // Auf "lv" darf sich grundsätzlich jeder aktive Nutzer einloggen.
        // Auf Sub-Tenants gilt:
        //   - Der Nutzer muss dem Tenant zugeordnet sein (local_group)
        //   - ODER er hat "Bundesrecht über Landesrecht":
        //     user_role_main === ROLE_ADMINISTRATOR -> Login auf jedem Sub-Tenant erlaubt.
        $isMainAdmin = $user->user_role_main === UserRole::USER_ROLE_ADMIN;
        $isMemberOfTenant = $tenant->slug === $user->local_group;

        if ($tenant->slug !== 'lv' && !$isMainAdmin && !$isMemberOfTenant) {
            Auth::logout();
            $request->session()->invalidate();
            $request->session()->regenerateToken();

            return back()->withErrors([
                'username' => 'Diese Zugangsdaten sind für diesen Stamm nicht gültig.',
            ]);
        }

        if (!$user->active) {
            Auth::logout();
            $request->session()->invalidate();
            $request->session()->regenerateToken();

            return back()->withErrors([
                'username' => 'Dieses Benutzerkonto ist nicht aktiv.',
            ]);
        }

        $request->session()->regenerate();

        return redirect()->intended('/');
    }
}
