package com.tasteby.util;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Parse address into "country|city|district" format.
 */
public final class RegionParser {

    private RegionParser() {}

    private static final Map<String, String> CITY_MAP = Map.ofEntries(
            Map.entry("서울특별시", "서울"), Map.entry("서울", "서울"),
            Map.entry("부산광역시", "부산"), Map.entry("부산", "부산"),
            Map.entry("대구광역시", "대구"), Map.entry("대구", "대구"),
            Map.entry("인천광역시", "인천"), Map.entry("인천", "인천"),
            Map.entry("광주광역시", "광주"), Map.entry("광주", "광주"),
            Map.entry("대전광역시", "대전"), Map.entry("대전", "대전"),
            Map.entry("울산광역시", "울산"), Map.entry("울산", "울산"),
            Map.entry("세종특별자치시", "세종"),
            Map.entry("경기도", "경기"), Map.entry("경기", "경기"),
            Map.entry("강원특별자치도", "강원"), Map.entry("강원도", "강원"),
            Map.entry("충청북도", "충북"), Map.entry("충청남도", "충남"),
            Map.entry("전라북도", "전북"), Map.entry("전북특별자치도", "전북"),
            Map.entry("전라남도", "전남"),
            Map.entry("경상북도", "경북"), Map.entry("경상남도", "경남"),
            Map.entry("제주특별자치도", "제주")
    );

    private static final Pattern KR_PATTERN = Pattern.compile("대한민국\\s+(\\S+)\\s+(\\S+)");

    public static String parse(String address) {
        if (address == null || address.isBlank()) return null;
        String addr = address.trim();

        // Japanese
        if (addr.startsWith("일본") || addr.contains("Japan")) {
            String city = null;
            if (addr.contains("Tokyo")) city = "도쿄";
            else if (addr.contains("Osaka")) city = "오사카";
            else if (addr.contains("Sapporo") || addr.contains("Hokkaido")) city = "삿포로";
            else if (addr.contains("Kyoto")) city = "교토";
            else if (addr.contains("Fukuoka")) city = "후쿠오카";
            return city != null ? "일본|" + city : "일본";
        }

        // Singapore
        if (addr.contains("Singapore") || addr.contains("싱가포르")) {
            return "싱가포르";
        }

        // Korean: "대한민국 시/도 구/시 ..."
        if (addr.contains("대한민국")) {
            Matcher m = KR_PATTERN.matcher(addr);
            if (m.find()) {
                String city = CITY_MAP.get(m.group(1));
                if (city != null) {
                    String gu = m.group(2);
                    if (gu.endsWith("구") || gu.endsWith("군") || gu.endsWith("시")) {
                        return "한국|" + city + "|" + gu;
                    }
                    return "한국|" + city;
                }
            }
            // Search parts
            String[] parts = addr.split("\\s+");
            for (int i = 0; i < parts.length; i++) {
                String city = CITY_MAP.get(parts[i]);
                if (city != null) {
                    String gu = (i > 0 && (parts[i - 1].endsWith("구") || parts[i - 1].endsWith("군") || parts[i - 1].endsWith("시")))
                            ? parts[i - 1] : null;
                    return gu != null ? "한국|" + city + "|" + gu : "한국|" + city;
                }
            }
            return "한국";
        }

        // Korean without prefix
        String[] parts = addr.split("\\s+");
        if (parts.length > 0) {
            String city = CITY_MAP.get(parts[0]);
            if (city != null) {
                if (parts.length > 1 && (parts[1].endsWith("구") || parts[1].endsWith("군") || parts[1].endsWith("시"))) {
                    return "한국|" + city + "|" + parts[1];
                }
                return "한국|" + city;
            }
        }

        return null;
    }
}
