// 인증 시스템 테스트 파일
// Phase 2-1A 구현 내용 테스트

import { PasswordUtils } from "../utils/passwordUtils";
import { JwtUtils } from "../utils/jwtUtils";
import { PersonBean } from "../types/auth";

// 테스트용 사용자 정보
const testUserInfo: PersonBean = {
  userId: "test_user",
  userName: "테스트 사용자",
  deptName: "개발팀",
  companyCode: "ILSHIN",
  email: "test@ilshin.com",
  tel: "02-1234-5678",
  cellPhone: "010-1234-5678",
};

/**
 * 비밀번호 암호화 테스트
 */
function testPasswordUtils(): void {
  console.log("\n=== 비밀번호 암호화 테스트 ===");

  const testPassword = "test1234";

  try {
    // 암호화 테스트
    const encrypted = PasswordUtils.encrypt(testPassword);
    console.log("원본 비밀번호:", testPassword);
    console.log("암호화 결과:", encrypted);

    // 복호화 테스트
    const decrypted = PasswordUtils.decrypt(encrypted);
    console.log("복호화 결과:", decrypted);
    console.log("복호화 성공:", testPassword === decrypted);

    // 비밀번호 검증 테스트
    const isMatch = PasswordUtils.matches(testPassword, encrypted);
    console.log("비밀번호 검증:", isMatch);

    // SHA256 해시 테스트
    const sha256Hash = PasswordUtils.encryptSha256(testPassword);
    console.log("SHA256 해시:", sha256Hash);

    // 마스터 패스워드 테스트
    const masterPasswordMatch = PasswordUtils.matches(
      "qlalfqjsgh11",
      "any_encrypted_password"
    );
    console.log("마스터 패스워드 검증:", masterPasswordMatch);
  } catch (error) {
    console.error("비밀번호 암호화 테스트 실패:", error);
  }
}

/**
 * JWT 토큰 테스트
 */
function testJwtUtils(): void {
  console.log("\n=== JWT 토큰 테스트 ===");

  try {
    // 토큰 생성 테스트
    const token = JwtUtils.generateToken(testUserInfo);
    console.log("생성된 토큰:", token);

    // 토큰 디코드 테스트
    const decoded = JwtUtils.decodeToken(token);
    console.log("디코드된 페이로드:", decoded);

    // 토큰 검증 테스트
    const verified = JwtUtils.verifyToken(token);
    console.log("검증된 사용자 정보:", verified);
    console.log("검증 성공:", testUserInfo.userId === verified.userId);

    // 토큰 만료 확인 테스트
    const isExpired = JwtUtils.isTokenExpired(token);
    console.log("토큰 만료 여부:", isExpired);

    // 사용자 ID 추출 테스트
    const userId = JwtUtils.getUserIdFromToken(token);
    console.log("토큰에서 추출한 사용자 ID:", userId);

    // 토큰 유효성 검사 테스트
    const validation = JwtUtils.validateToken(token);
    console.log("토큰 유효성 검사:", validation);

    // 토큰 갱신 테스트
    const refreshedToken = JwtUtils.refreshToken(token);
    console.log("갱신된 토큰:", refreshedToken);
    console.log("토큰 갱신 성공:", token !== refreshedToken);
  } catch (error) {
    console.error("JWT 토큰 테스트 실패:", error);
  }
}

/**
 * 잘못된 토큰 테스트
 */
function testInvalidToken(): void {
  console.log("\n=== 잘못된 토큰 테스트 ===");

  try {
    // 잘못된 토큰으로 검증 시도
    const invalidToken = "invalid.token.here";
    JwtUtils.verifyToken(invalidToken);
  } catch (error) {
    console.log(
      "예상된 오류 (잘못된 토큰):",
      error instanceof Error ? error.message : error
    );
  }

  try {
    // 만료된 토큰 테스트 (1초 후 만료되는 토큰 생성)
    const shortLivedToken = JwtUtils.generateToken(testUserInfo);
    // 실제로는 시간을 기다려야 하지만, 여기서는 검증 로직만 테스트
    console.log("단기 토큰 생성 성공");
  } catch (error) {
    console.error("단기 토큰 생성 실패:", error);
  }
}

/**
 * 통합 테스트
 */
function integrationTest(): void {
  console.log("\n=== 통합 테스트 ===");

  try {
    // 1. 비밀번호 암호화
    const password = "user1234";
    const encryptedPassword = PasswordUtils.encrypt(password);
    console.log("1. 비밀번호 암호화 완료");

    // 2. 사용자 정보로 JWT 토큰 생성
    const userInfo: PersonBean = {
      ...testUserInfo,
      userId: "integration_test_user",
    };
    const token = JwtUtils.generateToken(userInfo);
    console.log("2. JWT 토큰 생성 완료");

    // 3. 토큰에서 사용자 정보 추출
    const extractedUserInfo = JwtUtils.verifyToken(token);
    console.log("3. 토큰 검증 완료");

    // 4. 비밀번호 검증
    const passwordMatch = PasswordUtils.matches(password, encryptedPassword);
    console.log("4. 비밀번호 검증 완료");

    // 5. 결과 확인
    const allTestsPassed =
      passwordMatch &&
      extractedUserInfo.userId === userInfo.userId &&
      extractedUserInfo.userName === userInfo.userName;

    console.log("통합 테스트 결과:", allTestsPassed ? "성공" : "실패");
  } catch (error) {
    console.error("통합 테스트 실패:", error);
  }
}

/**
 * 메인 테스트 실행
 */
function runAllTests(): void {
  console.log("🚀 인증 시스템 테스트 시작");
  console.log("=".repeat(50));

  testPasswordUtils();
  testJwtUtils();
  testInvalidToken();
  integrationTest();

  console.log("\n" + "=".repeat(50));
  console.log("✅ 인증 시스템 테스트 완료");
}

// 테스트 실행
if (require.main === module) {
  runAllTests();
}

export {
  testPasswordUtils,
  testJwtUtils,
  testInvalidToken,
  integrationTest,
  runAllTests,
};
