from __future__ import annotations

from itertools import chain

MEETING_DOMAIN_KEYWORD_CATEGORIES: dict[str, tuple[str, ...]] = {
    "pangyo_collaboration": (
        "R&R",
        "알앤알",
        "백로그",
        "스프린트",
        "스탠드업",
        "데일리 스크럼",
        "온보딩",
        "오프보딩",
        "프로덕션",
        "스테이징",
        "핫픽스",
        "레거시",
        "디프리케이트",
        "리팩터링",
        "워크어라운드",
        "블로커",
        "오너십",
        "액션 아이템",
        "얼라인",
        "싱크",
        "어젠다",
        "ETA",
        "TBD",
        "ASAP",
        "테크 데트",
        "회고",
        "레트로",
    ),
    "backend_platforms": (
        "Python",
        "Java",
        "JavaScript",
        "TypeScript",
        "Node.js",
        "React",
        "Next.js",
        "Spring",
        "Spring Boot",
        "JPA",
        "ORM",
        "FastAPI",
        "Django",
        "NestJS",
    ),
    "api_backend_runtime": (
        "API",
        "에이피아이",
        "SDK",
        "CLI",
        "GUI",
        "REST API",
        "GraphQL",
        "gRPC",
        "Webhook",
        "JWT",
        "OAuth",
        "세션",
        "쿠키",
        "캐시",
        "Caching",
        "Redis",
        "레디스",
        "Queue",
        "큐",
        "Worker",
        "워커",
        "Batch",
        "배치",
        "Cron",
        "Scheduler",
        "Thread",
        "스레드",
        "Process",
        "프로세스",
        "멀티스레드",
        "비동기",
        "동기",
    ),
    "database_data": (
        "Database",
        "DB",
        "데이터베이스",
        "SQL",
        "NoSQL",
        "Schema",
        "스키마",
        "ERD",
        "정규화",
        "비정규화",
        "Transaction",
        "트랜잭션",
        "Index",
        "인덱스",
        "Deadlock",
        "교착상태",
        "Join",
        "조인",
        "Shard",
        "샤딩",
        "Replication",
        "레플리케이션",
        "PostgreSQL",
        "포스트그레SQL",
        "MySQL",
        "마이에스큐엘",
        "MongoDB",
        "몽고디비",
        "Kafka",
        "카프카",
    ),
    "infra_devops": (
        "Docker",
        "도커",
        "Docker Compose",
        "도커 컴포즈",
        "Kubernetes",
        "쿠버네티스",
        "K8s",
        "Pod",
        "파드",
        "Deployment",
        "디플로이먼트",
        "Service",
        "서비스",
        "Ingress",
        "인그레스",
        "ConfigMap",
        "Secret",
        "시크릿",
        "Namespace",
        "네임스페이스",
        "Helm",
        "CI/CD",
        "GitHub Actions",
        "Jenkins",
        "Deploy",
        "배포",
        "Rollback",
        "롤백",
        "Autoscaling",
        "오토스케일링",
        "Load Balancer",
        "로드밸런서",
        "Nginx",
        "엔진엑스",
        "CDN",
        "Reverse Proxy",
        "리버스 프록시",
        "Monitoring",
        "모니터링",
        "Logging",
        "로깅",
        "Tracing",
        "트레이싱",
        "Alerting",
        "알러팅",
    ),
    "network_security": (
        "TCP/IP",
        "HTTP",
        "HTTPS",
        "WebSocket",
        "웹소켓",
        "DNS",
        "SSL",
        "TLS",
        "CORS",
        "방화벽",
        "Firewall",
        "VPN",
        "인증",
        "인가",
        "암호화",
        "복호화",
        "토큰",
        "Certificate",
        "인증서",
    ),
    "ai_data": (
        "RAG",
        "래그",
        "Embedding",
        "임베딩",
        "Vector DB",
        "벡터 디비",
        "LLM",
        "Prompt",
        "프롬프트",
        "Inference",
        "추론",
        "Fine-tuning",
        "파인튜닝",
        "Hallucination",
        "할루시네이션",
        "Token",
        "토큰",
    ),
    "info_processing_engineer": (
        "요구사항",
        "UML",
        "Use Case",
        "유스케이스",
        "클래스 다이어그램",
        "시퀀스 다이어그램",
        "액티비티 다이어그램",
        "화면 설계",
        "인터페이스 구현",
        "테스트 케이스",
        "형상 관리",
        "응용 SW 기초 기술",
        "운영체제",
        "스케줄링",
        "메모리 관리",
        "OSI",
        "DFD",
        "데이터 흐름도",
        "자료 사전",
        "소프트웨어 개발 보안",
        "정렬",
        "탐색",
        "해시",
        "패키징",
        "정보시스템 구축관리",
    ),
}

def _dedupe(keywords: tuple[str, ...]) -> tuple[str, ...]:
    return tuple(dict.fromkeys(keyword.strip() for keyword in keywords if keyword.strip()))


DEFAULT_MEETING_DOMAIN_KEYWORDS: tuple[str, ...] = _dedupe(
    tuple(chain.from_iterable(MEETING_DOMAIN_KEYWORD_CATEGORIES.values()))
)

DEFAULT_MEETING_PROMPT_KEYWORDS: tuple[str, ...] = _dedupe(
    (
        "R&R",
        "알앤알",
        "백로그",
        "스프린트",
        "프로덕션",
        "핫픽스",
        "레거시",
        "리팩터링",
        "테크 데트",
        "Python",
        "Java",
        "JavaScript",
        "TypeScript",
        "React",
        "Next.js",
        "Spring",
        "Spring Boot",
        "FastAPI",
        "API",
        "에이피아이",
        "REST API",
        "GraphQL",
        "JWT",
        "Redis",
        "레디스",
        "PostgreSQL",
        "MySQL",
        "MongoDB",
        "Schema",
        "ERD",
        "정규화",
        "Transaction",
        "Index",
        "요구사항",
        "UML",
        "유스케이스",
        "Docker",
        "도커",
        "Kubernetes",
        "쿠버네티스",
        "CI/CD",
        "GitHub Actions",
        "Webhook",
        "OAuth",
        "Kafka",
        "Batch",
        "Worker",
        "Deploy",
        "Rollback",
        "Jenkins",
        "Docker Compose",
        "DFD",
        "정보시스템 구축관리",
        "HTTP",
        "HTTPS",
        "TCP/IP",
        "WebSocket",
        "RAG",
        "Embedding",
        "Vector DB",
        "LLM",
        "Prompt",
        "Inference",
    )
)


def build_default_domain_hint(max_chars: int = 320) -> str:
    if max_chars <= 2:
        return ""

    selected: list[str] = []
    used = 0
    for keyword in DEFAULT_MEETING_PROMPT_KEYWORDS:
        addition = len(keyword) if not selected else len(keyword) + 2
        if used + addition + 2 > max_chars:
            break
        selected.append(keyword)
        used += addition

    if not selected:
        return ""
    return ", ".join(selected) + ". "


DEFAULT_DOMAIN_HINT = build_default_domain_hint()

__all__ = [
    "MEETING_DOMAIN_KEYWORD_CATEGORIES",
    "DEFAULT_MEETING_DOMAIN_KEYWORDS",
    "DEFAULT_MEETING_PROMPT_KEYWORDS",
    "DEFAULT_DOMAIN_HINT",
    "build_default_domain_hint",
]
