import { axiosAdapter, p3Values } from 'point3-common-tool';

/**
 * LogtoUserAlreadyExistsError
 *
 * 사용자 생성 시 이미 동일한 사용자가 존재할 경우 발생하는 에러입니다.
 * 사용자 중복 체크 및 예외 처리에 사용됩니다.
 */
export class LogtoUserAlreadyExistsError extends Error {
    constructor(message: string) {
        super(message);
        this.name = 'UserAlreadyExistsError';
    }
}

/**
 * LogtoPasswordAlgorithm
 *
 * Logto에서 지원하는 비밀번호 해시 알고리즘 Enum입니다.
 * - Argon2i, Argon2id, Argon2d: Argon2 계열(권장)
 * - SHA1, Bcrypt: 기타 호환 알고리즘
 * 기본값은 Argon2i 입니다.
 */
export enum LogtoPasswordAlgorithm {
    Argon2i = 'Argon2i',
    Argon2id = 'Argon2id',
    Argon2d = 'Argon2d',
    SHA1 = 'SHA1',
    Bcrypt = 'Bcrypt',
}

/**
 * LogtoUser
 *
 * Logto 사용자 생성/수정 시 사용하는 타입입니다.
 * - username: Guid 문자열
 * - primaryPhone: 대표 휴대폰번호
 * - primaryEmail: 대표 이메일
 * - password: 비밀번호(필수)
 * - passwordAlgorithm: 비밀번호 해시 알고리즘(기본값 Argon2i)
 * - name: 사용자 이름
 * - avatar: 프로필 이미지(선택)
 * - customData: 추가 사용자 데이터(선택)
 */
export type LogtoUser = {
    username: string; // Guid's string value(dash to underscore)
    primaryPhone?: string;
    primaryEmail: string;
    password: string;
    passwordAlgorithm?: LogtoPasswordAlgorithm; // default: Argon2i
    name: string;
    avatar?: string;
    customData?: Record<string, any>;
};

/**
 * LogtoUserResponse
 *
 * 사용자 생성/조회 시 반환되는 타입입니다.
 * - id: 사용자 고유 ID
 * - LogtoUser의 모든 필드 포함
 */
export type LogtoUserResponse = { id: string } & LogtoUser;

/**
 * LogtoPersonalAccessTokenResponse
 *
 * 사용자의 Personal Access Token 목록 조회 시 반환되는 응답 객체입니다.
 */
export type LogtoPersonalAccessTokenResponse = {
    tenantId: string;
    userId: string;
    name: string;
    value: string;
    createdAt: number;
    expiresAt: number | null;
};

/**
 * LogtoRole
 * LogtoRole
 *
 * Logto 역할(Role) 생성/수정 시 사용하는 타입입니다.
 * - name: 역할 이름
 * - description: 역할 설명
 * - type: 역할 유형(User, MachineToMachine 등)
 * - isDefault: 기본 역할 여부(선택)
 */
export type LogtoRole = {
    name: string;
    description: string;
    type: string; // User, MachineToMachine
    isDefault?: boolean;
};

/**
 * LogtoRoleResponse
 *
 * 역할 생성/조회 시 반환되는 타입입니다.
 * - id: 역할 고유 ID
 * - LogtoRole의 모든 필드 포함
 */
export type LogtoRoleResponse = { id: string } & LogtoRole;

/**
 * VerificationMethodType
 *
 * 인증코드(Verification Code) 발송 시 사용할 수 있는 인증 수단 타입입니다.
 * - phone: 휴대폰 인증(p3Values.PhoneNumber)
 * - email: 이메일 인증(p3Values.Email)
 *
 * 예시:
 *   VerificationMethodType.phone
 *   VerificationMethodType.email
 */
export class VerificationMethodType {
    static phone = p3Values.PhoneNumber;
    static email = p3Values.Email;
}

/**
 * SMSVerificationResponse
 *
 * SMS 인증코드 발송 시 반환되는 응답 객체입니다.
 * - verificationId: 인증 세션 고유 ID
 * - expiresAt: 만료 시각(ISO8601 문자열)
 */
export class SMSVerificationResponse {
    verificationId: string;
    expiresAt: string;

    constructor(verificationId: string, expiresAt: string) {
        this.verificationId = verificationId;
        this.expiresAt = expiresAt;
    }
}

/**
 * LogtoOAuthRESTTemplate
 *
 * Logto OAuth 및 API 요청을 위한 REST 템플릿 클래스입니다.
 * axiosAdapter.RESTTemplate을 상속하여, 인증/권한 관련 요청에 사용됩니다.
 */
export class LogtoOAuthRESTTemplate extends axiosAdapter.RESTTemplate {};

/**
 * LogtoLoggerServiceToken
 *
 * DI(의존성 주입)에서 사용되는 로거 서비스 토큰입니다.
 */
export const LogtoLoggerServiceToken = Symbol.for("LogtoLoggerService");
