"use client";

import React, { useState, useCallback, useEffect } from "react";
import { UserAuthTable } from "@/components/admin/UserAuthTable";
import { UserAuthEditModal } from "@/components/admin/UserAuthEditModal";
import { userAPI } from "@/lib/api/user";
import { useAuth } from "@/hooks/useAuth";
import { AlertCircle } from "lucide-react";
import { Button } from "@/components/ui/button";
import { ScrollToTop } from "@/components/common/ScrollToTop";
import { usePageMultiLang } from "@/hooks/usePageMultiLang";

// 다국어 키 목록
const USER_AUTH_KEYS = [
  "user.auth.title", "user.auth.description",
  "access.denied", "access.denied.msg", "button.back",
  "error.occurred", "error.load.users", "error.load.users.detail",
  "role.super_admin", "role.company_admin", "role.user", "role.guest", "role.partner", "role.unassigned",
  "table.userId", "table.userName", "table.company", "table.dept", "table.currentAuth",
  "table.empty", "table.actions", "action.change.auth",
  "pagination.prev", "pagination.next",
] as const;

// 한국어 기본 텍스트
const USER_AUTH_DEFAULTS: Record<string, string> = {
  "user.auth.title": "사용자 권한 관리",
  "user.auth.description": "사용자별 권한 레벨을 관리합니다.",
  "access.denied": "접근 권한 없음",
  "access.denied.msg": "권한 관리는 관리자만 접근할 수 있습니다.",
  "button.back": "뒤로 가기",
  "error.occurred": "오류가 발생했습니다",
  "error.load.users": "사용자 목록을 불러오는데 실패했습니다.",
  "error.load.users.detail": "사용자 목록을 불러오는 중 오류가 발생했습니다.",
  "role.super_admin": "최고 관리자",
  "role.company_admin": "회사 관리자",
  "role.user": "일반 사용자",
  "role.guest": "게스트",
  "role.partner": "협력업체",
  "role.unassigned": "미지정",
  "table.userId": "사용자 ID",
  "table.userName": "사용자명",
  "table.company": "회사",
  "table.dept": "부서",
  "table.currentAuth": "현재 권한",
  "table.empty": "등록된 사용자가 없습니다.",
  "table.actions": "액션",
  "action.change.auth": "권한 변경",
  "pagination.prev": "이전",
  "pagination.next": "다음",
};

/**
 * 사용자 권한 관리 페이지
 * URL: /admin/userAuth
 *
 * 관리자(최고관리자 + 회사관리자) 접근 가능
 * 사용자별 권한 레벨(SUPER_ADMIN, COMPANY_ADMIN, USER 등) 관리
 * 회사관리자는 SUPER_ADMIN 권한 부여 불가
 */
export default function UserAuthPage() {
  const { t } = usePageMultiLang({
    keys: USER_AUTH_KEYS,
    defaults: USER_AUTH_DEFAULTS,
    menuCode: "user.auth",
  });
  const { user: currentUser } = useAuth();

  // 관리자 여부
  const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN";
  const isAdmin = isSuperAdmin || currentUser?.userType === "COMPANY_ADMIN";

  // 상태 관리
  const [users, setUsers] = useState<any[]>([]);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);
  const [paginationInfo, setPaginationInfo] = useState({
    currentPage: 1,
    pageSize: 20,
    totalItems: 0,
    totalPages: 0,
  });

  // 권한 변경 모달
  const [authEditModal, setAuthEditModal] = useState({
    isOpen: false,
    user: null as any | null,
  });

  // 데이터 로드
  const loadUsers = useCallback(
    async (page: number = 1) => {
      setIsLoading(true);
      setError(null);

      try {
        const response = await userAPI.getList({
          page,
          size: paginationInfo.pageSize,
          ...(currentUser?.userType === "COMPANY_ADMIN" && currentUser?.companyCode
            ? { companyCode: currentUser.companyCode }
            : {}),
        });

        if (response.success && response.data) {
          setUsers(response.data);
          setPaginationInfo({
            currentPage: response.currentPage || page,
            pageSize: response.pageSize || paginationInfo.pageSize,
            totalItems: response.total || 0,
            totalPages: Math.ceil((response.total || 0) / (response.pageSize || paginationInfo.pageSize)),
          });
        } else {
          setError(response.message || t("error.load.users"));
        }
      } catch (err) {
        console.error("사용자 목록 로드 오류:", err);
        setError(t("error.load.users.detail"));
      } finally {
        setIsLoading(false);
      }
    },
    [paginationInfo.pageSize],
  );

  useEffect(() => {
    loadUsers(1);
  }, []);

  // 권한 변경 핸들러
  const handleEditAuth = (user: any) => {
    setAuthEditModal({
      isOpen: true,
      user,
    });
  };

  // 권한 변경 모달 닫기
  const handleAuthEditClose = () => {
    setAuthEditModal({
      isOpen: false,
      user: null,
    });
  };

  // 권한 변경 성공
  const handleAuthEditSuccess = () => {
    loadUsers(paginationInfo.currentPage);
    handleAuthEditClose();
  };

  // 페이지 변경
  const handlePageChange = (page: number) => {
    loadUsers(page);
  };

  // 관리자가 아닌 경우
  if (!isAdmin) {
    return (
      <div className="bg-background flex min-h-screen flex-col">
        <div className="space-y-6 p-6">
          <div className="space-y-2 border-b pb-4">
            <h1 className="text-3xl font-bold tracking-tight">{t("user.auth.title")}</h1>
            <p className="text-muted-foreground text-sm">{t("user.auth.description")}</p>
          </div>

          <div className="bg-card flex h-64 flex-col items-center justify-center rounded-lg border p-6 shadow-sm">
            <AlertCircle className="text-destructive mb-4 h-12 w-12" />
            <h3 className="mb-2 text-lg font-semibold">{t("access.denied")}</h3>
            <p className="text-muted-foreground mb-4 text-center text-sm">
              {t("access.denied.msg")}
            </p>
            <Button variant="outline" onClick={() => window.history.back()}>
              {t("button.back")}
            </Button>
          </div>
        </div>

        <ScrollToTop />
      </div>
    );
  }

  return (
    <div className="bg-background flex min-h-screen flex-col">
      <div className="space-y-6 p-6">
        {/* 페이지 헤더 */}
        <div className="space-y-2 border-b pb-4">
          <h1 className="text-3xl font-bold tracking-tight">{t("user.auth.title")}</h1>
          <p className="text-muted-foreground text-sm">{t("user.auth.description")}</p>
        </div>

        {/* 에러 메시지 */}
        {error && (
          <div className="border-destructive/50 bg-destructive/10 rounded-lg border p-4">
            <div className="flex items-center justify-between">
              <p className="text-destructive text-sm font-semibold">{t("error.occurred")}</p>
              <button
                onClick={() => setError(null)}
                className="text-destructive hover:text-destructive/80 transition-colors"
                aria-label="에러 메시지 닫기"
              >
                ✕
              </button>
            </div>
            <p className="text-destructive/80 mt-1.5 text-sm">{error}</p>
          </div>
        )}

        {/* 사용자 권한 테이블 */}
        <UserAuthTable
          users={users}
          isLoading={isLoading}
          isSuperAdmin={isSuperAdmin}
          paginationInfo={paginationInfo}
          onEditAuth={handleEditAuth}
          onPageChange={handlePageChange}
          t={t}
        />

        {/* 권한 변경 모달 */}
        <UserAuthEditModal
          isOpen={authEditModal.isOpen}
          onClose={handleAuthEditClose}
          onSuccess={handleAuthEditSuccess}
          user={authEditModal.user}
          currentUser={currentUser}
        />
      </div>

      {/* Scroll to Top 버튼 (모바일/태블릿 전용) */}
      <ScrollToTop />
    </div>
  );
}
