package CHAPTER08;

import java.util.*;

// 변환 기록을 저장하는 클래스 (입력값과 변환값 저장)
class ConversionRecord {
    private String original;   // 원본 문자열
    private String converted;  // 변환된 문자열 (모스 부호)

    public ConversionRecord(String original, String converted) {
        this.original = original;
        this.converted = converted;
    }

    // 객체 동등성 비교 (내용 기반 equals 오버라이드)
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true; // 같은 객체
        if (!(obj instanceof ConversionRecord)) return false;

        ConversionRecord other = (ConversionRecord) obj;
        return this.original.equals(other.original) &&
               this.converted.equals(other.converted); // 원본과 변환 문자열이 모두 같아야 true
    }

    // equals와 일치하도록 hashCode 오버라이드
    @Override
    public int hashCode() {
        return original.hashCode() + converted.hashCode();
    }
}

public class REAL_01_MorseCode {
    // 알파벳을 모스 부호로 매핑하는 해시맵
    private static final Map<Character, String> morseMap = new HashMap<>();

    // 정적 초기화 블록 (모스 부호 정의)
    static {
        morseMap.put('A', ".-");    morseMap.put('B', "-...");
        morseMap.put('C', "-.-.");  morseMap.put('D', "-..");
        morseMap.put('E', ".");     morseMap.put('F', "..-.");
        morseMap.put('G', "--.");   morseMap.put('H', "....");
        morseMap.put('I', "..");    morseMap.put('J', ".---");
        morseMap.put('K', "-.-");   morseMap.put('L', ".-..");
        morseMap.put('M', "--");    morseMap.put('N', "-.");
        morseMap.put('O', "---");   morseMap.put('P', ".--.");
        morseMap.put('Q', "--.-");  morseMap.put('R', ".-.");
        morseMap.put('S', "...");   morseMap.put('T', "-");
        morseMap.put('U', "..-");   morseMap.put('V', "...-");
        morseMap.put('W', ".--");   morseMap.put('X', "-..-");
        morseMap.put('Y', "-.--");  morseMap.put('Z', "--..");
        morseMap.put(' ', " / "); // 공백은 슬래시로 표시
    }

    // 입력 문자열을 모스 부호로 변환하는 함수
    public static String toMorseCode(String message) {
        StringBuilder morse = new StringBuilder();

        for (char c : message.toUpperCase().toCharArray()) {
            if (morseMap.containsKey(c)) {
                morse.append(morseMap.get(c)).append(" ");
            } else {
                morse.append("? "); // 정의되지 않은 문자는 ?로 표시
            }
        }
        return morse.toString();
    }

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

        // 사용자 입력
        System.out.print("영문 메시지를 입력하세요: ");
        String input = scanner.nextLine();

        // 모스 부호 변환
        String morseResult = toMorseCode(input);

        // 결과 출력
        System.out.println("\n[모스 부호 변환 결과]");
        System.out.println(morseResult);

        // 인증 코드 생성 (Math.random 사용, 10000 ~ 99999 범위)
        int authCode = (int)(Math.random() * 90000) + 10000;
        System.out.println("\n인증 코드: " + authCode);

        // Object 클래스 메서드 예시 (equals 사용)
        ConversionRecord record1 = new ConversionRecord(input, morseResult);
        ConversionRecord record2 = new ConversionRecord(input, morseResult);

        System.out.println("이전 기록과 동일한가? " + record1.equals(record2)); // true
        scanner.close();
    }
}
