// 기존 Java Spring Boot의 인증 관련 DTO 클래스들을 TypeScript로 포팅
import { Request } from "express";

// 기존 ApiLoginController.LoginRequest 클래스 포팅
export interface LoginRequest {
  userId: string;
  password: string;
}

// 사용자 권한 레벨 (3단계 체계)
export enum UserRole {
  SUPER_ADMIN = "SUPER_ADMIN", // 최고 관리자 (전체 시스템)
  COMPANY_ADMIN = "COMPANY_ADMIN", // 회사 관리자 (자기 회사만)
  USER = "USER", // 일반 사용자
  GUEST = "GUEST", // 게스트
  PARTNER = "PARTNER", // 협력업체
}

// 기존 ApiLoginController.UserInfo 클래스 포팅
export interface UserInfo {
  userId: string;
  userName: string;
  deptName: string;
  companyCode: string;
  userType?: string;
  userTypeName?: string;
  email?: string;
  photo?: string;
  locale?: string;
  isAdmin?: boolean; // 하위 호환성 유지
  isSuperAdmin?: boolean; // 슈퍼관리자 여부 (company_code === '*' && userType === 'SUPER_ADMIN')
  isCompanyAdmin?: boolean; // 회사 관리자 여부 (userType === 'COMPANY_ADMIN')
}

// 기존 ApiLoginController.ApiResponse 클래스 포팅
export interface ApiResponse<T = any> {
  success: boolean;
  message?: string;
  data?: T;
  error?: {
    code: string;
    details?: any;
  };
}

// 기존 PersonBean 클래스 포팅 (세션에 저장되는 사용자 정보)
export interface PersonBean {
  userId: string;
  userName: string;
  userNameEng?: string;
  userNameCn?: string;
  deptCode?: string;
  deptName?: string;
  positionCode?: string;
  positionName?: string;
  email?: string;
  tel?: string;
  cellPhone?: string;
  userType?: string;
  userTypeName?: string;
  partnerObjid?: string;
  authName?: string;
  companyCode?: string;
  companyName?: string; // 회사명 추가
  photo?: string;
  locale?: string;
  // 권한 레벨 정보 (3단계 체계)
  isSuperAdmin?: boolean; // 최고 관리자 (company_code === '*' && userType === 'SUPER_ADMIN')
  isCompanyAdmin?: boolean; // 회사 관리자 (userType === 'COMPANY_ADMIN')
  isAdmin?: boolean; // 관리자 (슈퍼관리자 + 회사관리자)
}

// 로그인 결과 타입 (기존 LoginService.loginPwdCheck 반환값)
export interface LoginResult {
  loginResult: boolean;
  errorReason?: string;
}

// 로그인 로그 데이터 타입 (기존 insertLoginAccessLog 파라미터)
export interface LoginLogData {
  systemName: string;
  userId: string;
  loginResult: boolean;
  errorMessage?: string;
  remoteAddr: string;
  recptnDt?: string;
  recptnRsltDtl?: string;
  recptnRslt?: string;
  recptnRsltCd?: string;
}

// JWT 토큰 페이로드 타입
export interface JwtPayload {
  userId: string;
  userName: string;
  deptName?: string;
  companyCode?: string;
  companyName?: string; // 회사명 추가
  userType?: string;
  userTypeName?: string;
  iat?: number;
  exp?: number;
  aud?: string;
  iss?: string;
}

// 인증 상태 정보 타입 (기존 checkAuthStatus 반환값)
export interface AuthStatusInfo {
  isAuthenticated: boolean;
  sessionId?: string;
}

// 인증된 요청 타입 (미들웨어에서 사용)
export interface AuthenticatedRequest extends Request {
  user?: PersonBean;
}

// 사용자 변경이력 타입
export interface UserHistory {
  sabun: string;
  userId: string;
  userName: string;
  deptCode: string;
  deptName: string;
  userTypeName: string;
  historyType: string;
  writer: string;
  writerName: string;
  regDate: Date;
  regDateTitle: string;
  status: string;
  rowNum: number;
}
