package main

import (
	"encoding/hex"
	"fmt"
	"io"
	"strings"

	"golang.org/x/text/encoding/korean"
	"golang.org/x/text/transform"
)

// UTF-8 문자열을 hex로 변환
func utf8ToHex(s string) string {
	return hex.EncodeToString([]byte(s))
}

// UTF-8 문자열을 EUC-KR hex로 변환
func utf8ToEUCKRHex(s string) (string, error) {
	encoder := korean.EUCKR.NewEncoder()
	eucKRBytes, _, err := transform.Bytes(encoder, []byte(s))
	if err != nil {
		return "", fmt.Errorf("EUC-KR encoding error: %v", err)
	}
	return hex.EncodeToString(eucKRBytes), nil
}

// EUC-KR hex를 한글(UTF-8)로 변환
func eucKRHexToUTF8(hexString string) (string, error) {
	bytes, err := hex.DecodeString(hexString)
	if err != nil {
		return "", fmt.Errorf("hex decoding error: %v", err)
	}

	decoder := korean.EUCKR.NewDecoder()
	reader := transform.NewReader(strings.NewReader(string(bytes)), decoder)
	result, err := io.ReadAll(reader)
	if err != nil {
		return "", fmt.Errorf("EUC-KR decoding error: %v", err)
	}

	return string(result), nil
}

func main() {
	// 사용자로부터 UTF-8 한글 입력 받기
	var koreanInput string
	fmt.Print("한글을 입력하세요 (UTF-8): ")
	fmt.Scanln(&koreanInput)

	// 1. UTF-8 한글을 hex로 변환
	utf8Hex := utf8ToHex(koreanInput)
	fmt.Printf("1. UTF-8 Hex: %s\n", utf8Hex)

	// 2. UTF-8 한글을 EUC-KR hex로 변환
	eucKRHex, err := utf8ToEUCKRHex(koreanInput)
	if err != nil {
		fmt.Printf("Error converting to EUC-KR hex: %v\n", err)
		return
	}
	fmt.Printf("2. EUC-KR Hex: %s\n", eucKRHex)

	// 3. EUC-KR hex를 다시 한글(UTF-8)로 변환
	koreanOutput, err := eucKRHexToUTF8(eucKRHex)
	if err != nil {
		fmt.Printf("Error converting back to Korean: %v\n", err)
		return
	}
	fmt.Printf("3. Decoded Korean (UTF-8): %s\n", koreanOutput)
}
