"""WICS 섹터 분류기 — 3단계 하이브리드 방식.

분류 우선순위:
1. 수동 오버라이드 (대형주 ~100종목)
2. 주요제품 키워드 분석
3. KSIC(KIND 업종명) 매핑
"""

from __future__ import annotations

from typing import Optional

from dartlab.engines.sector.types import (
    IndustryGroup,
    Sector,
    SectorInfo,
)

S = Sector
G = IndustryGroup

MANUAL_OVERRIDES: dict[str, tuple[Sector, IndustryGroup]] = {
    "SK하이닉스": (S.IT, G.SEMICONDUCTOR),
    "삼성전자": (S.IT, G.SEMICONDUCTOR),
    "DB하이텍": (S.IT, G.SEMICONDUCTOR),
    "리노공업": (S.IT, G.SEMICONDUCTOR),
    "한미반도체": (S.IT, G.SEMICONDUCTOR),
    "HPSP": (S.IT, G.SEMICONDUCTOR),
    "주성엔지니어링": (S.IT, G.SEMICONDUCTOR),
    "원익IPS": (S.IT, G.SEMICONDUCTOR),
    "피에스케이": (S.IT, G.SEMICONDUCTOR),
    "테스": (S.IT, G.SEMICONDUCTOR),
    "유진테크": (S.IT, G.SEMICONDUCTOR),
    "이오테크닉스": (S.IT, G.SEMICONDUCTOR),
    "LG디스플레이": (S.IT, G.DISPLAY),
    "삼성SDI": (S.MATERIALS, G.CHEMICAL),
    "LG에너지솔루션": (S.MATERIALS, G.CHEMICAL),
    "카카오": (S.COMMUNICATION, G.INTERNET),
    "네이버": (S.COMMUNICATION, G.INTERNET),
    "NAVER": (S.COMMUNICATION, G.INTERNET),
    "카카오페이": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "카카오뱅크": (S.FINANCIALS, G.BANK),
    "토스": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "크래프톤": (S.COMMUNICATION, G.GAME),
    "넷마블": (S.COMMUNICATION, G.GAME),
    "엔씨소프트": (S.COMMUNICATION, G.GAME),
    "펄어비스": (S.COMMUNICATION, G.GAME),
    "카카오게임즈": (S.COMMUNICATION, G.GAME),
    "컴투스": (S.COMMUNICATION, G.GAME),
    "위메이드": (S.COMMUNICATION, G.GAME),
    "데브시스터즈": (S.COMMUNICATION, G.GAME),
    "하이브": (S.COMMUNICATION, G.MEDIA),
    "SM": (S.COMMUNICATION, G.MEDIA),
    "JYP Ent.": (S.COMMUNICATION, G.MEDIA),
    "YG엔터테인먼트": (S.COMMUNICATION, G.MEDIA),
    "CJ ENM": (S.COMMUNICATION, G.MEDIA),
    "스튜디오드래곤": (S.COMMUNICATION, G.MEDIA),
    "삼성바이오로직스": (S.HEALTHCARE, G.PHARMA_BIO),
    "셀트리온": (S.HEALTHCARE, G.PHARMA_BIO),
    "셀트리온헬스케어": (S.HEALTHCARE, G.HEALTHCARE_EQUIP),
    "SK바이오팜": (S.HEALTHCARE, G.PHARMA_BIO),
    "SK바이오사이언스": (S.HEALTHCARE, G.PHARMA_BIO),
    "유한양행": (S.HEALTHCARE, G.PHARMA_BIO),
    "한미약품": (S.HEALTHCARE, G.PHARMA_BIO),
    "녹십자": (S.HEALTHCARE, G.PHARMA_BIO),
    "대웅제약": (S.HEALTHCARE, G.PHARMA_BIO),
    "종근당": (S.HEALTHCARE, G.PHARMA_BIO),
    "현대자동차": (S.CONSUMER_DISC, G.AUTO),
    "기아": (S.CONSUMER_DISC, G.AUTO),
    "현대모비스": (S.CONSUMER_DISC, G.AUTO),
    "현대위아": (S.CONSUMER_DISC, G.AUTO),
    "만도": (S.CONSUMER_DISC, G.AUTO),
    "한온시스템": (S.CONSUMER_DISC, G.AUTO),
    "HL만도": (S.CONSUMER_DISC, G.AUTO),
    "POSCO홀딩스": (S.MATERIALS, G.METALS),
    "포스코": (S.MATERIALS, G.METALS),
    "현대제철": (S.MATERIALS, G.METALS),
    "동국제강": (S.MATERIALS, G.METALS),
    "LG화학": (S.MATERIALS, G.CHEMICAL),
    "롯데케미칼": (S.MATERIALS, G.CHEMICAL),
    "금호석유화학": (S.MATERIALS, G.CHEMICAL),
    "한화솔루션": (S.MATERIALS, G.CHEMICAL),
    "SK이노베이션": (S.ENERGY, G.OIL_GAS),
    "S-Oil": (S.ENERGY, G.OIL_GAS),
    "에쓰오일": (S.ENERGY, G.OIL_GAS),
    "HD현대오일뱅크": (S.ENERGY, G.OIL_GAS),
    "HD한국조선해양": (S.INDUSTRIALS, G.SHIPBUILDING),
    "삼성중공업": (S.INDUSTRIALS, G.SHIPBUILDING),
    "한화오션": (S.INDUSTRIALS, G.SHIPBUILDING),
    "HD현대중공업": (S.INDUSTRIALS, G.SHIPBUILDING),
    "삼성물산": (S.INDUSTRIALS, G.CONSTRUCTION),
    "현대건설": (S.INDUSTRIALS, G.CONSTRUCTION),
    "GS건설": (S.INDUSTRIALS, G.CONSTRUCTION),
    "DL이앤씨": (S.INDUSTRIALS, G.CONSTRUCTION),
    "KB금융": (S.FINANCIALS, G.BANK),
    "신한지주": (S.FINANCIALS, G.BANK),
    "하나금융지주": (S.FINANCIALS, G.BANK),
    "우리금융지주": (S.FINANCIALS, G.BANK),
    "기업은행": (S.FINANCIALS, G.BANK),
    "삼성증권": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "미래에셋증권": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "NH투자증권": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "키움증권": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "삼성화재": (S.FINANCIALS, G.INSURANCE),
    "삼성생명": (S.FINANCIALS, G.INSURANCE),
    "DB손해보험": (S.FINANCIALS, G.INSURANCE),
    "현대해상": (S.FINANCIALS, G.INSURANCE),
    "신세계": (S.CONSUMER_DISC, G.RETAIL),
    "이마트": (S.CONSUMER_DISC, G.RETAIL),
    "BGF리테일": (S.CONSUMER_DISC, G.RETAIL),
    "GS리테일": (S.CONSUMER_DISC, G.RETAIL),
    "CJ제일제당": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "오리온": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "농심": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "삼양식품": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "하이트진로": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "오뚜기": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "SK텔레콤": (S.COMMUNICATION, G.TELECOM),
    "KT": (S.COMMUNICATION, G.TELECOM),
    "LG유플러스": (S.COMMUNICATION, G.TELECOM),
    "한국전력": (S.UTILITIES, G.ELECTRIC),
    "한국가스공사": (S.UTILITIES, G.GAS_UTILITY),
    "한국지역난방공사": (S.UTILITIES, G.GAS_UTILITY),
    "한화에어로스페이스": (S.INDUSTRIALS, G.AEROSPACE_DEFENSE),
    "LIG넥스원": (S.INDUSTRIALS, G.AEROSPACE_DEFENSE),
    "한국항공우주": (S.INDUSTRIALS, G.AEROSPACE_DEFENSE),
    "대한항공": (S.INDUSTRIALS, G.TRANSPORTATION),
    "SK": (S.IT, G.IT_SERVICE),
    "LG": (S.IT, G.TECH_HARDWARE),
    "CJ": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "GS": (S.ENERGY, G.OIL_GAS),
    "HD현대": (S.INDUSTRIALS, G.SHIPBUILDING),
    "LS": (S.INDUSTRIALS, G.MACHINERY),
    "한화": (S.INDUSTRIALS, G.AEROSPACE_DEFENSE),
    "두산": (S.INDUSTRIALS, G.MACHINERY),
    "효성": (S.MATERIALS, G.CHEMICAL),
    "에코프로": (S.MATERIALS, G.CHEMICAL),
    "LG전자": (S.IT, G.TECH_HARDWARE),
}

KSIC_TO_SECTOR: dict[str, tuple[Sector, IndustryGroup]] = {
    "반도체 제조업": (S.IT, G.SEMICONDUCTOR),
    "전자부품 제조업": (S.IT, G.SEMICONDUCTOR),
    "마그네틱 및 광학 매체 제조업": (S.IT, G.TECH_HARDWARE),
    "컴퓨터 및 주변장치 제조업": (S.IT, G.TECH_HARDWARE),
    "영상 및 음향기기 제조업": (S.IT, G.TECH_HARDWARE),
    "통신 및 방송 장비 제조업": (S.IT, G.TECH_HARDWARE),
    "소프트웨어 개발 및 공급업": (S.IT, G.SOFTWARE),
    "컴퓨터 프로그래밍, 시스템 통합 및 관리업": (S.IT, G.IT_SERVICE),
    "자료처리, 호스팅, 포털 및 기타 인터넷 정보매개 서비스업": (S.COMMUNICATION, G.INTERNET),
    "기타 정보 서비스업": (S.IT, G.IT_SERVICE),
    "의약품 제조업": (S.HEALTHCARE, G.PHARMA_BIO),
    "기초 의약물질 제조업": (S.HEALTHCARE, G.PHARMA_BIO),
    "의료용 기기 제조업": (S.HEALTHCARE, G.HEALTHCARE_EQUIP),
    "의료용품 및 기타 의약 관련제품 제조업": (S.HEALTHCARE, G.HEALTHCARE_EQUIP),
    "자연과학 및 공학 연구개발업": (S.HEALTHCARE, G.PHARMA_BIO),
    "은행 및 저축기관": (S.FINANCIALS, G.BANK),
    "신탁업 및 집합투자업": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "금융 지원 서비스업": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "기타 금융업": (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS),
    "보험업": (S.FINANCIALS, G.INSURANCE),
    "보험 및 연금관련 서비스업": (S.FINANCIALS, G.INSURANCE),
    "재 보험업": (S.FINANCIALS, G.INSURANCE),
    "자동차용 엔진 및 자동차 제조업": (S.CONSUMER_DISC, G.AUTO),
    "자동차 신품 부품 제조업": (S.CONSUMER_DISC, G.AUTO),
    "자동차 재제조 부품 제조업": (S.CONSUMER_DISC, G.AUTO),
    "자동차 차체나 트레일러 제조업": (S.CONSUMER_DISC, G.AUTO),
    "자동차 판매업": (S.CONSUMER_DISC, G.RETAIL),
    "자동차 부품 및 내장품 판매업": (S.CONSUMER_DISC, G.RETAIL),
    "1차 철강 제조업": (S.MATERIALS, G.METALS),
    "1차 비철금속 제조업": (S.MATERIALS, G.METALS),
    "금속 주조업": (S.MATERIALS, G.METALS),
    "구조용 금속제품, 탱크 및 증기발생기 제조업": (S.MATERIALS, G.METALS),
    "기타 금속 가공제품 제조업": (S.MATERIALS, G.METALS),
    "기초 화학물질 제조업": (S.MATERIALS, G.CHEMICAL),
    "합성고무 및 플라스틱 물질 제조업": (S.MATERIALS, G.CHEMICAL),
    "비료, 농약 및 살균, 살충제 제조업": (S.MATERIALS, G.CHEMICAL),
    "기타 화학제품 제조업": (S.MATERIALS, G.CHEMICAL),
    "화학섬유 제조업": (S.MATERIALS, G.CHEMICAL),
    "플라스틱제품 제조업": (S.MATERIALS, G.CHEMICAL),
    "고무제품 제조업": (S.MATERIALS, G.CHEMICAL),
    "석유 정제품 제조업": (S.ENERGY, G.OIL_GAS),
    "연료용 가스 제조 및 배관공급업": (S.UTILITIES, G.GAS_UTILITY),
    "전기업": (S.UTILITIES, G.ELECTRIC),
    "증기, 냉·온수 및 공기조절 공급업": (S.UTILITIES, G.GAS_UTILITY),
    "건물 건설업": (S.INDUSTRIALS, G.CONSTRUCTION),
    "토목 건설업": (S.INDUSTRIALS, G.CONSTRUCTION),
    "기반조성 및 시설물 축조관련 전문공사업": (S.INDUSTRIALS, G.CONSTRUCTION),
    "건물설비 설치 공사업": (S.INDUSTRIALS, G.CONSTRUCTION),
    "전기 및 통신 공사업": (S.INDUSTRIALS, G.CONSTRUCTION),
    "실내건축 및 건축마무리 공사업": (S.INDUSTRIALS, G.CONSTRUCTION),
    "일반 목적용 기계 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "특수 목적용 기계 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "전동기, 발전기 및 전기 변환 · 공급 · 제어 장치 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "기타 전기장비 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "전구 및 조명장치 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "일차전지 및 이차전지 제조업": (S.MATERIALS, G.CHEMICAL),
    "절연선 및 케이블 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "선박 및 보트 건조업": (S.INDUSTRIALS, G.SHIPBUILDING),
    "철도장비 제조업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "항공기,우주선 및 부품 제조업": (S.INDUSTRIALS, G.AEROSPACE_DEFENSE),
    "무기 및 총포탄 제조업": (S.INDUSTRIALS, G.AEROSPACE_DEFENSE),
    "해상 운송업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "항공 여객 운송업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "육상 여객 운송업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "도로 화물 운송업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "기타 운송관련 서비스업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "전기 통신업": (S.COMMUNICATION, G.TELECOM),
    "텔레비전 방송업": (S.COMMUNICATION, G.MEDIA),
    "영화, 비디오물, 방송프로그램 제작 및 배급업": (S.COMMUNICATION, G.MEDIA),
    "영상·오디오물 제공 서비스업": (S.COMMUNICATION, G.MEDIA),
    "오디오물 출판 및 원판 녹음업": (S.COMMUNICATION, G.MEDIA),
    "광고업": (S.COMMUNICATION, G.MEDIA),
    "창작 및 예술관련 서비스업": (S.COMMUNICATION, G.MEDIA),
    "종합 소매업": (S.CONSUMER_DISC, G.RETAIL),
    "무점포 소매업": (S.CONSUMER_DISC, G.RETAIL),
    "상품 종합 도매업": (S.CONSUMER_DISC, G.RETAIL),
    "기타 상품 전문 소매업": (S.CONSUMER_DISC, G.RETAIL),
    "섬유, 의복, 신발 및 가죽제품 소매업": (S.CONSUMER_DISC, G.RETAIL),
    "가전제품 및 정보통신장비 소매업": (S.CONSUMER_DISC, G.RETAIL),
    "연료 소매업": (S.CONSUMER_DISC, G.RETAIL),
    "기타 식품 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "과실, 채소 가공 및 저장 처리업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "도축, 육류 가공 및 저장 처리업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "수산물 가공 및 저장 처리업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "동·식물성 유지 및 낙농제품 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "곡물가공품, 전분 및 전분제품 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "떡, 빵 및 과자류 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "알코올음료 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "비알코올음료 및 얼음 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "동물용 사료 및 조제식품 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "도시락 및 식사용 조리식품 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "담배 제조업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "음·식료품 및 담배 도매업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "음·식료품 및 담배 소매업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "음식점업": (S.CONSUMER_DISC, G.HOTEL_LEISURE),
    "봉제의복 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "편조의복 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "의복 액세서리 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "신발 및 신발 부분품 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "가죽, 가방 및 유사제품 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "귀금속 및 장신용품 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "가정용 기기 제조업": (S.CONSUMER_STAPLES, G.HOUSEHOLD),
    "생활용품 도매업": (S.CONSUMER_STAPLES, G.HOUSEHOLD),
    "기타 생활용품 소매업": (S.CONSUMER_STAPLES, G.HOUSEHOLD),
    "부동산 임대 및 공급업": (S.REAL_ESTATE, G.REAL_ESTATE),
    "부동산 관련 서비스업": (S.REAL_ESTATE, G.REAL_ESTATE),
    "일반 및 생활 숙박시설 운영업": (S.CONSUMER_DISC, G.HOTEL_LEISURE),
    "유원지 및 기타 오락관련 서비스업": (S.CONSUMER_DISC, G.HOTEL_LEISURE),
    "스포츠 서비스업": (S.CONSUMER_DISC, G.HOTEL_LEISURE),
    "여행사 및 기타 여행보조 서비스업": (S.CONSUMER_DISC, G.HOTEL_LEISURE),
    "일반 교습 학원": (S.CONSUMER_DISC, G.CONSUMER_SERVICE),
    "기타 교육기관": (S.CONSUMER_DISC, G.CONSUMER_SERVICE),
    "교육지원 서비스업": (S.CONSUMER_DISC, G.CONSUMER_SERVICE),
    "초등 교육기관": (S.CONSUMER_DISC, G.CONSUMER_SERVICE),
    "건축기술, 엔지니어링 및 관련 기술 서비스업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "기타 과학기술 서비스업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "회사 본부 및 경영 컨설팅 서비스업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "기타 전문 서비스업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "전문디자인업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "시장조사 및 여론조사업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "측정, 시험, 항해, 제어 및 기타 정밀기기 제조업; 광학기기 제외": (S.INDUSTRIALS, G.MACHINERY),
    "사진장비 및 광학기기 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "가구 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "악기 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "운동 및 경기용구 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "그외 기타 제품 제조업": (S.INDUSTRIALS, G.MACHINERY),
    "펄프, 종이 및 판지 제조업": (S.MATERIALS, G.PAPER),
    "골판지, 종이 상자 및 종이용기 제조업": (S.MATERIALS, G.CONTAINERS),
    "기타 종이 및 판지 제품 제조업": (S.MATERIALS, G.PAPER),
    "인쇄 및 인쇄관련 산업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "서적, 잡지 및 기타 인쇄물 출판업": (S.COMMUNICATION, G.MEDIA),
    "기록매체 복제업": (S.COMMUNICATION, G.MEDIA),
    "방적 및 가공사 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "직물직조 및 직물제품 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "편조원단 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "섬유제품 염색, 정리 및 마무리 가공업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "기타 섬유제품 제조업": (S.CONSUMER_DISC, G.CONSUMER_DURABLES),
    "유리 및 유리제품 제조업": (S.MATERIALS, G.CONSTRUCTION_MATERIALS),
    "시멘트, 석회, 플라스터 및 그 제품 제조업": (S.MATERIALS, G.CONSTRUCTION_MATERIALS),
    "내화, 비내화 요업제품 제조업": (S.MATERIALS, G.CONSTRUCTION_MATERIALS),
    "기타 비금속 광물제품 제조업": (S.MATERIALS, G.CONSTRUCTION_MATERIALS),
    "제재 및 목재 가공업": (S.MATERIALS, G.PAPER),
    "나무제품 제조업": (S.MATERIALS, G.PAPER),
    "폐기물 처리업": (S.UTILITIES, G.UTILITIES),
    "해체, 선별 및 원료 재생업": (S.UTILITIES, G.UTILITIES),
    "작물 재배업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "어로 어업": (S.CONSUMER_STAPLES, G.FOOD_BEV_TOBACCO),
    "사업시설 유지·관리 서비스업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "기타 사업지원 서비스업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "경비, 경호 및 탐정업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "개인 및 가정용품 수리업": (S.CONSUMER_DISC, G.CONSUMER_SERVICE),
    "개인 및 가정용품 임대업": (S.CONSUMER_DISC, G.CONSUMER_SERVICE),
    "산업용 기계 및 장비 임대업": (S.INDUSTRIALS, G.MACHINERY),
    "운송장비 임대업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "그외 기타 개인 서비스업": (S.CONSUMER_DISC, G.CONSUMER_SERVICE),
    "그외 기타 운송장비 제조업": (S.INDUSTRIALS, G.TRANSPORTATION),
    "그외 기타 전문, 과학 및 기술 서비스업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
    "산업용 농·축산물 및 동·식물 도매업": (S.CONSUMER_STAPLES, G.FOOD_STAPLES),
    "건축자재, 철물 및 난방장치 도매업": (S.INDUSTRIALS, G.CAPITAL_GOODS),
    "기계장비 및 관련 물품 도매업": (S.INDUSTRIALS, G.CAPITAL_GOODS),
    "기타 전문 도매업": (S.INDUSTRIALS, G.CAPITAL_GOODS),
    "상품 중개업": (S.INDUSTRIALS, G.COMMERCIAL_SERVICE),
}

PRODUCT_KEYWORDS: dict[tuple[Sector, IndustryGroup], list[str]] = {
    (S.IT, G.SEMICONDUCTOR): [
        "DRAM", "NAND", "메모리반도체", "파운드리", "SoC", "DDR",
        "웨이퍼", "CPU", "GPU", "NPU", "HBM",
        "시스템반도체", "반도체설계", "반도체제조",
        "반도체장비", "반도체 장비", "CVD", "식각장비", "에칭", "증착장비", "세정장비",
        "반도체검사", "반도체테스트", "반도체패키징", "프로브카드", "본더",
    ],
    (S.IT, G.DISPLAY): [
        "디스플레이패널", "OLED패널", "LCD패널", "터치스크린", "LED디스플레이",
    ],
    (S.COMMUNICATION, G.GAME): [
        "게임", "모바일게임", "온라인게임", "MMORPG", "RPG", "퍼블리싱",
        "리니지", "배틀그라운드", "메이플", "던전", "로스트아크",
    ],
    (S.HEALTHCARE, G.PHARMA_BIO): [
        "바이오", "항체", "세포치료", "유전자", "CMO", "CDMO", "바이오시밀러",
        "항암제", "면역", "백신", "mRNA", "ADC", "CAR-T",
        "의약품", "제약", "신약", "복제약",
    ],
    (S.MATERIALS, G.CHEMICAL): [
        "2차전지", "이차전지", "배터리", "리튬", "양극재", "음극재",
        "분리막", "전해질", "ESS", "전기차배터리",
    ],
    (S.COMMUNICATION, G.INTERNET): [
        "인터넷플랫폼", "포털사이트", "검색엔진", "온라인광고", "이커머스", "온라인쇼핑",
        "SNS", "메신저", "OTT", "스트리밍서비스",
    ],
    (S.FINANCIALS, G.DIVERSIFIED_FINANCIALS): [
        "핀테크", "간편결제", "페이", "송금", "대출플랫폼", "P2P",
        "크라우드펀딩", "로보어드바이저",
    ],
    (S.COMMUNICATION, G.MEDIA): [
        "엔터테인먼트", "K-POP", "아이돌", "연예", "매니지먼트", "기획사",
        "음반", "공연", "콘서트", "팬덤", "스트리밍", "방송",
    ],
    (S.IT, G.SOFTWARE): [
        "AI", "인공지능", "머신러닝", "딥러닝", "SaaS", "클라우드",
        "빅데이터", "데이터분석", "RPA", "자동화",
    ],
    (S.INDUSTRIALS, G.AEROSPACE_DEFENSE): [
        "방산", "국방", "미사일", "레이더", "전투기", "무기체계",
        "K방산", "K9", "K2", "FA-50", "항공우주",
    ],
    (S.ENERGY, G.ENERGY_EQUIP): [
        "태양광", "풍력", "수소", "연료전지", "신재생", "ESS",
        "태양전지", "태양열", "그린에너지",
    ],
}


def classify(
    companyName: str,
    kindIndustry: Optional[str] = None,
    mainProducts: Optional[str] = None,
) -> SectorInfo:
    """기업을 WICS 투자 섹터로 분류.

    우선순위: 수동 오버라이드 → 키워드 분석 → KSIC 매핑.

    Args:
        companyName: 회사명.
        kindIndustry: KIND 업종명 (KSIC 기반 한글).
        mainProducts: 주요제품 텍스트.

    Returns:
        SectorInfo 분류 결과.
    """
    if companyName in MANUAL_OVERRIDES:
        sector, group = MANUAL_OVERRIDES[companyName]
        return SectorInfo(sector=sector, industryGroup=group, confidence=1.0, source="override")

    for name, (sector, group) in MANUAL_OVERRIDES.items():
        if len(name) >= 2 and (name in companyName or companyName in name):
            return SectorInfo(sector=sector, industryGroup=group, confidence=0.95, source="override_partial")

    if mainProducts:
        isHolding = "지주회사" in mainProducts or "지주사업" in mainProducts
        if not isHolding:
            result = _matchKeywords(mainProducts)
            if result is not None:
                return result

    if kindIndustry and kindIndustry in KSIC_TO_SECTOR:
        sector, group = KSIC_TO_SECTOR[kindIndustry]
        return SectorInfo(sector=sector, industryGroup=group, confidence=0.7, source="ksic")

    return SectorInfo(sector=S.UNKNOWN, industryGroup=G.UNKNOWN, confidence=0.0, source="unknown")


def _matchKeywords(products: str) -> Optional[SectorInfo]:
    productsLower = products.lower()
    bestMatch: Optional[tuple[Sector, IndustryGroup]] = None
    bestScore = 0

    for (sector, group), keywords in PRODUCT_KEYWORDS.items():
        score = sum(1 for kw in keywords if kw.lower() in productsLower)
        if score > bestScore:
            bestScore = score
            bestMatch = (sector, group)

    if bestMatch and bestScore >= 1:
        confidence = min(0.9, 0.6 + bestScore * 0.1)
        return SectorInfo(
            sector=bestMatch[0],
            industryGroup=bestMatch[1],
            confidence=confidence,
            source="keyword",
        )
    return None
