package CHAPTER08;

import java.util.*;

// 팰린드롬 검사 결과를 저장하는 클래스
class PalindromeRecord {
	private String originalInput; // 원본 입력 문자열
	private boolean result; // 팰린드롬 판별 결과

	public PalindromeRecord(String input, boolean result) {
		this.originalInput = input;
		this.result = result;
	}

	// equals 오버라이드: 내용이 같으면 동일 객체로 판단
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!(obj instanceof PalindromeRecord))
			return false;

		PalindromeRecord other = (PalindromeRecord) obj;
		return this.originalInput.equals(other.originalInput) && this.result == other.result;
	}

	// hashCode 오버라이드: equals와 일관되도록
	@Override
	public int hashCode() {
		return originalInput.hashCode() + Boolean.hashCode(result);
	}
}

public class LAB_02_Discrimination {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		// 사용자 입력
		System.out.print("문장을 입력하세요: ");
		String input = scanner.nextLine();

		// 문자열 정제 (대소문자 무시, 공백 및 특수문자 제거)
		String cleaned = cleanString(input);
		boolean isPalindrome = isPalindrome(cleaned); // 팰린드롬 판별

		// 결과 출력
		System.out.println("\n[입력값 정제 결과] " + cleaned);
		System.out.println("→ 팰린드롬 여부: " + (isPalindrome ? "맞습니다!" : "아닙니다."));

		// 무작위 응원 메시지 출력 (Math 클래스 활용)
		String[] messages = { "잘했어요!", "멋집니다!", "계속 도전해보세요!", "훌륭합니다!" };
		int index = (int) (Math.random() * messages.length);
		System.out.println("[응원 메시지] " + messages[index]);

		// Object 클래스 활용: equals 오버라이드 비교
		PalindromeRecord record1 = new PalindromeRecord(input, isPalindrome);
		PalindromeRecord record2 = new PalindromeRecord(input, isPalindrome);
		System.out.println("같은 입력 기록인가요? " + record1.equals(record2));

		scanner.close();
	}

	// 문자열 정제 함수: 영문자/숫자만 남기고 소문자로 변환
	public static String cleanString(String str) {
		return str.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
	}

	// 팰린드롬 판별 함수
	public static boolean isPalindrome(String str) {
		int len = str.length();
		for (int i = 0; i < len / 2; i++) {
			if (str.charAt(i) != str.charAt(len - 1 - i)) {
				return false;
			}
		}
		return true;
	}
}
