<?php

namespace App\Http\Controllers;

use App\Models\Department;
use App\Models\Role;
use App\Models\Tenants\Tenant;
use App\Services\UserService;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\View\View;

class UserController extends Controller
{
    public function __construct(
        private readonly UserService $userService
    ) {}

    /**
     * 사용자 목록 페이지
     * HTMX 요청 시 전체 페이지 리로드 (스크립트 로딩을 위해)
     */
    public function index(Request $request): View|Response
    {
        if ($request->header('HX-Request')) {
            return response('', 200)->header('HX-Redirect', route('users.index'));
        }

        return view('users.index');
    }

    /**
     * 사용자 생성 페이지
     */
    public function create(): View
    {
        $tenantId = session('selected_tenant_id');

        // 역할/부서 목록 (테넌트별)
        $roles = $tenantId ? Role::where('tenant_id', $tenantId)->orderBy('name')->get() : collect();
        $departments = $tenantId ? Department::where('tenant_id', $tenantId)->where('is_active', true)->orderBy('name')->get() : collect();

        // 본사 테넌트 여부 확인 (본사: 이메일 인증, 그 외: 비밀번호 직접 입력)
        $isHQ = false;
        if ($tenantId) {
            $tenant = Tenant::find($tenantId);
            $isHQ = $tenant?->tenant_type === 'HQ';
        }

        return view('users.create', compact('roles', 'departments', 'isHQ'));
    }

    /**
     * 사용자 수정 페이지
     */
    public function edit(int $id): View
    {
        // 슈퍼관리자 보호: 일반관리자가 슈퍼관리자에 접근 불가 (존재하지 않는 것처럼)
        if (! $this->userService->canAccessUser($id)) {
            abort(404, '사용자를 찾을 수 없습니다.');
        }

        $user = $this->userService->getUserById($id);

        if (! $user) {
            abort(404, '사용자를 찾을 수 없습니다.');
        }

        $tenantId = session('selected_tenant_id');

        // 역할/부서 목록 (테넌트별)
        $roles = $tenantId ? Role::where('tenant_id', $tenantId)->orderBy('name')->get() : collect();
        $departments = $tenantId ? Department::where('tenant_id', $tenantId)->where('is_active', true)->orderBy('name')->get() : collect();

        // 사용자의 현재 역할/부서 ID 목록
        $userRoleIds = $tenantId ? $user->userRoles()->where('tenant_id', $tenantId)->pluck('role_id')->toArray() : [];
        $userDepartmentIds = $tenantId ? $user->departmentUsers()->where('tenant_id', $tenantId)->pluck('department_id')->toArray() : [];

        return view('users.edit', compact('user', 'roles', 'departments', 'userRoleIds', 'userDepartmentIds'));
    }
}
