#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
벡터DB용 통신 업무 도메인 샘플 데이터 자동 생성 스크립트

생성 목표: 15개 도메인 × 4개 소스 × 5개 = 300개 샘플
"""

import json
import random
from datetime import datetime, timedelta
from typing import List, Dict

# 도메인 정의
DOMAINS = [
    "네트워크 인프라",
    "기술 개발 및 연구",
    "고객 서비스",
    "영업 및 마케팅",
    "요금 및 청구",
    "네트워크 운용",
    "서비스 기획 및 상품 개발",
    "정보보안",
    "시스템 운영 및 관리",
    "가입자 관리",
    "망 품질 관리",
    "규제 대응 및 준법",
    "기업 영업",
    "로밍 및 국제 업무",
    "신사업"
]

# 문서 유형
DOC_TYPES = {
    "meeting_minutes": "이전 회의록",
    "manual": "조직문서",
    "project_doc": "프로젝트 문서",
    "operation_doc": "운영문서"
}

# 도메인별 키워드 및 토픽
DOMAIN_KEYWORDS = {
    "네트워크 인프라": {
        "keywords": ["5G", "LTE", "기지국", "광케이블", "RAN", "코어망", "백홀", "전송망"],
        "topics": ["5G 구축", "기지국 설치", "망 이중화", "광케이블 교체", "커버리지 확대"]
    },
    "기술 개발 및 연구": {
        "keywords": ["AI", "빅데이터", "IoT", "클라우드", "머신러닝", "NFV", "SDN", "엣지컴퓨팅"],
        "topics": ["AI 기술 연구", "빅데이터 플랫폼", "IoT 표준화", "클라우드 아키텍처", "기술 PoC"]
    },
    "고객 서비스": {
        "keywords": ["VoC", "NPS", "고객만족도", "CS", "콜센터", "챗봇", "응대품질", "민원"],
        "topics": ["VoC 분석", "상담품질 개선", "챗봇 도입", "고객만족도 향상", "민원 처리"]
    },
    "영업 및 마케팅": {
        "keywords": ["요금제", "프로모션", "ARPU", "가입자", "캠페인", "번들", "마케팅", "유통"],
        "topics": ["요금제 개편", "프로모션 기획", "가입자 확대", "브랜드 마케팅", "유통채널 관리"]
    },
    "요금 및 청구": {
        "keywords": ["과금", "청구", "미수금", "정산", "빌링", "ERP", "요금오류", "환불"],
        "topics": ["청구 시스템 개선", "미수금 관리", "요금 오류 분석", "정산 자동화", "환불 처리"]
    },
    "네트워크 운용": {
        "keywords": ["장애", "모니터링", "트래픽", "NOC", "복구", "성능", "최적화", "KPI"],
        "topics": ["장애 대응", "망 모니터링", "트래픽 분석", "성능 최적화", "품질 관리"]
    },
    "서비스 기획 및 상품 개발": {
        "keywords": ["신규서비스", "부가서비스", "콘텐츠", "OTT", "상품기획", "MVP", "베타테스트"],
        "topics": ["신규 서비스 기획", "부가서비스 개발", "콘텐츠 제휴", "상품 출시", "베타 테스트"]
    },
    "정보보안": {
        "keywords": ["보안", "개인정보", "ISMS-P", "DDoS", "침해사고", "취약점", "암호화", "인증"],
        "topics": ["보안 정책 수립", "개인정보 보호", "침해사고 대응", "취약점 점검", "보안 인증"]
    },
    "시스템 운영 및 관리": {
        "keywords": ["IDC", "클라우드", "DevOps", "CI/CD", "Kubernetes", "Docker", "모니터링", "백업"],
        "topics": ["시스템 운영", "클라우드 전환", "DevOps 구축", "인프라 관리", "재해복구"]
    },
    "가입자 관리": {
        "keywords": ["MNP", "개통", "해지", "명의변경", "USIM", "가입자정보", "번호이동", "CRM"],
        "topics": ["가입자 정보 관리", "번호이동 처리", "개통 절차", "해지 방지", "USIM 관리"]
    },
    "망 품질 관리": {
        "keywords": ["QoS", "SLA", "품질측정", "KPI", "성능지표", "커버리지", "통화품질", "데이터속도"],
        "topics": ["품질 측정", "SLA 관리", "커버리지 개선", "통화품질 향상", "성능 지표 분석"]
    },
    "규제 대응 및 준법": {
        "keywords": ["전기통신사업법", "규제", "과기정통부", "방통위", "허가", "신고", "컴플라이언스", "법규"],
        "topics": ["규제 대응", "법규 준수", "허가 신청", "정부 정책", "컴플라이언스"]
    },
    "기업 영업": {
        "keywords": ["B2B", "전용선", "MPLS", "VPN", "IDC", "클라우드", "AICC", "SIP"],
        "topics": ["B2B 영업", "전용선 구축", "클라우드 솔루션", "AICC 제안", "데이터센터"]
    },
    "로밍 및 국제 업무": {
        "keywords": ["로밍", "GSMA", "TADIG", "eSIM", "국제전화", "해외통신사", "정산", "협정"],
        "topics": ["로밍 서비스", "eSIM 도입", "국제 협력", "TADIG 관리", "로밍 정산"]
    },
    "신사업": {
        "keywords": ["OTT", "핀테크", "스마트홈", "IoT", "AI", "간편결제", "콘텐츠", "플랫폼"],
        "topics": ["OTT 플랫폼", "핀테크 서비스", "스마트홈", "IoT 사업", "신규 플랫폼"]
    }
}

# 작성자 이름 풀
AUTHORS = [
    "김철수", "이영희", "박민수", "정수진", "최영호", "강민지", "윤서연", "장현우",
    "임지혜", "한동훈", "오세진", "백지영", "신동엽", "권혁진", "송민재", "조윤서"
]

def get_random_date(start_date: str = "2024-01-01", end_date: str = "2025-01-22") -> str:
    """랜덤 날짜 생성"""
    start = datetime.strptime(start_date, "%Y-%m-%d")
    end = datetime.strptime(end_date, "%Y-%m-%d")
    random_date = start + timedelta(days=random.randint(0, (end - start).days))
    return random_date.strftime("%Y-%m-%d")

def generate_meeting_minutes(domain: str, index: int) -> Dict:
    """회의록 생성"""
    keywords = DOMAIN_KEYWORDS[domain]["keywords"]
    topics = DOMAIN_KEYWORDS[domain]["topics"]

    topic = random.choice(topics)
    keyword1 = random.choice(keywords)
    keyword2 = random.choice([k for k in keywords if k != keyword1])

    participants = random.sample(AUTHORS, k=random.randint(3, 5))

    content = f"""회의 일시: {get_random_date()} 14:00~16:00
참석자: {', '.join(participants)}

논의 내용:
1. {topic} 현황 분석
- 현재 상황 및 문제점 파악
- {keyword1} 관련 이슈 검토
- {keyword2} 개선 방안 논의

2. 주요 의사결정 사항
- {topic} 추진 방향 결정
- 예산 및 일정 확정
- 담당자 역할 분담

3. 기대 효과
- 서비스 품질 향상
- 운영 효율성 증대
- 고객 만족도 개선

결정 사항:
- {topic} 프로젝트 착수
- 월 1회 진행상황 점검
- 다음 회의: 2주 후

액션 아이템:
- {participants[0]}: 상세 계획 수립 (D+7)
- {participants[1]}: 기술 검토 및 설계 (D+14)
- {participants[2]}: 예산 확보 및 승인 (D+10)
"""

    return {
        "document_id": f"{domain.replace(' ', '_')}_meeting_{index:03d}",
        "document_type": "meeting_minutes",
        "title": f"{topic} 회의",
        "content": content,
        "metadata": {
            "domain": domain,
            "date": get_random_date(),
            "author": participants[0],
            "tags": [keyword1, keyword2, topic.split()[0]],
            "organization_id": "org_telecom_001",
            "folder_id": f"folder_{domain.replace(' ', '_')}"
        }
    }

def generate_manual(domain: str, index: int) -> Dict:
    """매뉴얼/조직문서 생성"""
    keywords = DOMAIN_KEYWORDS[domain]["keywords"]
    topics = DOMAIN_KEYWORDS[domain]["topics"]

    topic = random.choice(topics)
    keyword1 = random.choice(keywords)
    keyword2 = random.choice([k for k in keywords if k != keyword1])

    content = f"""# {topic} 업무 매뉴얼

## 1. 목적
본 매뉴얼은 {domain} 분야의 {topic} 업무 수행을 위한 표준 절차를 정의한다.

## 2. 적용 범위
- 대상 부서: {domain} 담당 부서
- 관련 시스템: {keyword1}, {keyword2} 관련 시스템

## 3. 업무 프로세스

### 3.1 사전 준비
- 필요 자료 및 도구 준비
- 시스템 접근 권한 확인
- 관련 부서 협조 요청

### 3.2 주요 업무 수행
1. {keyword1} 관련 작업
   - 현황 파악 및 분석
   - 계획 수립 및 승인
   - 실행 및 모니터링

2. {keyword2} 관련 작업
   - 기술 검토 및 설계
   - 구현 및 테스트
   - 배포 및 운영

### 3.3 사후 관리
- 결과 보고서 작성
- 성과 평가 및 피드백
- 개선사항 도출

## 4. 주의 사항
- 보안 정책 준수
- 관련 법규 및 규정 확인
- 정기적인 절차 개선

## 5. 문의처
- 담당 부서: {domain}팀
- 이메일: {domain.replace(' ', '_').lower()}@telecom.com
"""

    return {
        "document_id": f"{domain.replace(' ', '_')}_manual_{index:03d}",
        "document_type": "manual",
        "title": f"{topic} 업무 매뉴얼",
        "content": content,
        "metadata": {
            "domain": domain,
            "date": get_random_date(),
            "author": f"{domain}본부",
            "tags": [keyword1, keyword2, "매뉴얼", "프로세스"],
            "organization_id": "org_telecom_001",
            "folder_id": f"folder_{domain.replace(' ', '_')}"
        }
    }

def generate_project_doc(domain: str, index: int) -> Dict:
    """프로젝트 문서 생성"""
    keywords = DOMAIN_KEYWORDS[domain]["keywords"]
    topics = DOMAIN_KEYWORDS[domain]["topics"]

    topic = random.choice(topics)
    keyword1 = random.choice(keywords)
    keyword2 = random.choice([k for k in keywords if k != keyword1])

    content = f"""# {topic} 프로젝트 계획서

## 1. 프로젝트 개요
- 프로젝트명: {topic} 구축 프로젝트
- 기간: {get_random_date()} ~ {get_random_date("2025-03-01", "2025-12-31")}
- 예산: 약 {random.randint(5, 50)}억원

## 2. 추진 배경
{domain} 분야에서 {keyword1} 및 {keyword2} 관련 업무의 효율성을 높이고 서비스 품질을 향상시키기 위해 본 프로젝트를 추진한다.

## 3. 주요 목표
- {keyword1} 시스템 구축 및 고도화
- {keyword2} 프로세스 개선
- 운영 효율성 30% 향상
- 고객 만족도 20% 개선

## 4. 추진 전략

### 4.1 기술 전략
- {keyword1} 최신 기술 적용
- {keyword2} 표준 준수
- 확장 가능한 아키텍처 설계

### 4.2 일정 계획
- 1단계 (1~3개월): 요구사항 분석 및 설계
- 2단계 (4~6개월): 개발 및 구축
- 3단계 (7~9개월): 테스트 및 안정화
- 4단계 (10~12개월): 운영 이관 및 교육

## 5. 기대 효과
- 업무 처리 시간 50% 단축
- 운영 비용 연간 {random.randint(5, 20)}억원 절감
- 서비스 품질 향상
- 시장 경쟁력 강화

## 6. 리스크 관리
- 기술적 리스크: 신기술 적용에 따른 안정성 검증
- 일정 리스크: 외부 요인에 의한 지연 가능성
- 예산 리스크: 환율 변동 및 추가 요구사항

## 7. 프로젝트 조직
- PM: {random.choice(AUTHORS)}
- 기술팀장: {random.choice(AUTHORS)}
- 운영팀장: {random.choice(AUTHORS)}
"""

    return {
        "document_id": f"{domain.replace(' ', '_')}_project_{index:03d}",
        "document_type": "project_doc",
        "title": f"{topic} 프로젝트 계획서",
        "content": content,
        "metadata": {
            "domain": domain,
            "date": get_random_date(),
            "author": random.choice(AUTHORS),
            "tags": [keyword1, keyword2, "프로젝트", topic.split()[0]],
            "organization_id": "org_telecom_001",
            "folder_id": f"folder_{domain.replace(' ', '_')}"
        }
    }

def generate_operation_doc(domain: str, index: int) -> Dict:
    """운영문서 생성"""
    keywords = DOMAIN_KEYWORDS[domain]["keywords"]
    topics = DOMAIN_KEYWORDS[domain]["topics"]

    topic = random.choice(topics)
    keyword1 = random.choice(keywords)
    keyword2 = random.choice([k for k in keywords if k != keyword1])

    severity = random.choice(["긴급", "높음", "보통", "낮음"])

    content = f"""# {topic} 운영 보고서

## 1. 보고 개요
- 일시: {get_random_date()}
- 작성자: {random.choice(AUTHORS)}
- 심각도: {severity}

## 2. 상황 요약
{domain} 분야에서 {keyword1} 관련 {topic} 이슈가 발생하였으며, {keyword2} 시스템에 영향을 미쳤다.

## 3. 상세 내용

### 3.1 발생 경위
- 발생 시각: {get_random_date()} {random.randint(0, 23):02d}:{random.randint(0, 59):02d}
- 감지 방법: 자동 모니터링 시스템 알람
- 영향 범위: {random.choice(['전국', '수도권', '특정 지역', '일부 고객'])}

### 3.2 원인 분석
- 직접 원인: {keyword1} 시스템 {random.choice(['오류', '성능 저하', '장애', '설정 오류'])}
- 근본 원인: {keyword2} {random.choice(['업데이트', '설정 변경', '트래픽 급증', '외부 요인'])}

### 3.3 조치 사항
1. 즉시 조치
   - {keyword1} 시스템 재시작
   - {keyword2} 설정 롤백
   - 백업 시스템 전환

2. 후속 조치
   - 근본 원인 제거
   - 재발 방지 대책 수립
   - 관련 프로세스 개선

## 4. 영향 분석
- 영향 받은 고객 수: 약 {random.randint(100, 10000):,}명
- 서비스 중단 시간: 약 {random.randint(5, 180)}분
- 예상 손실액: 약 {random.randint(100, 5000):,}만원

## 5. 재발 방지 대책
- 모니터링 강화
- 사전 테스트 절차 보완
- 백업 시스템 이중화
- 운영 매뉴얼 개선

## 6. 결론
신속한 대응으로 서비스 영향을 최소화하였으며, 재발 방지 대책을 수립하여 향후 유사 이슈 발생을 예방한다.
"""

    return {
        "document_id": f"{domain.replace(' ', '_')}_operation_{index:03d}",
        "document_type": "operation_doc",
        "title": f"{topic} 운영 보고서",
        "content": content,
        "metadata": {
            "domain": domain,
            "date": get_random_date(),
            "author": random.choice(AUTHORS),
            "tags": [keyword1, keyword2, "운영", severity],
            "organization_id": "org_telecom_001",
            "folder_id": f"folder_{domain.replace(' ', '_')}"
        }
    }

def generate_all_samples() -> List[Dict]:
    """전체 샘플 생성 (15 도메인 × 4 소스 × 5개 = 300개)"""
    all_samples = []

    for domain in DOMAINS:
        print(f"생성 중: {domain}")

        # 각 문서 유형별로 5개씩 생성
        for i in range(5):
            all_samples.append(generate_meeting_minutes(domain, i + 1))
            all_samples.append(generate_manual(domain, i + 1))
            all_samples.append(generate_project_doc(domain, i + 1))
            all_samples.append(generate_operation_doc(domain, i + 1))

    return all_samples

def main():
    """메인 실행 함수"""
    print("=" * 60)
    print("벡터DB용 통신 업무 샘플 데이터 생성 시작")
    print(f"목표: 15개 도메인 × 4개 소스 × 5개 = 300개")
    print("=" * 60)
    print()

    # 샘플 생성
    samples = generate_all_samples()

    print()
    print(f"총 {len(samples)}개 샘플 생성 완료")
    print()

    # JSON 파일로 저장
    output_file = "data/samples/vector_db_samples_300.json"

    # 디렉토리 생성
    import os
    os.makedirs(os.path.dirname(output_file), exist_ok=True)

    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(samples, f, ensure_ascii=False, indent=2)

    print(f"파일 저장 완료: {output_file}")
    print()

    # 통계 출력
    print("=" * 60)
    print("생성 통계")
    print("=" * 60)

    doc_type_count = {}
    domain_count = {}

    for sample in samples:
        doc_type = sample['document_type']
        domain = sample['metadata']['domain']

        doc_type_count[doc_type] = doc_type_count.get(doc_type, 0) + 1
        domain_count[domain] = domain_count.get(domain, 0) + 1

    print("\n문서 유형별:")
    for doc_type, count in sorted(doc_type_count.items()):
        print(f"  {DOC_TYPES[doc_type]}: {count}개")

    print("\n도메인별:")
    for domain, count in sorted(domain_count.items()):
        print(f"  {domain}: {count}개")

    print("\n" + "=" * 60)
    print("완료!")
    print("=" * 60)

if __name__ == "__main__":
    main()
