# -*- coding: utf-8 -*-
"""
데이터 검증 모듈
"""

import logging
from typing import Dict, List

logger = logging.getLogger(__name__)


def validate_stalker_data(stalker_name: str, stalker_data: Dict) -> bool:
    """
    스토커 데이터 검증

    Args:
        stalker_name: 스토커 이름
        stalker_data: 스토커 데이터

    Returns:
        검증 성공 여부
    """
    warnings = []
    errors = []

    # 기본 정보 검증
    basic_info = stalker_data.get('basic_info', {})
    if not basic_info.get('name'):
        warnings.append(f"[{stalker_name}] 이름 정보 누락")

    # 스탯 검증
    stats = stalker_data.get('stats', {})
    if not stats:
        errors.append(f"[{stalker_name}] 스탯 정보 누락")
    else:
        # 스탯 합계 확인 (75여야 함)
        stat_sum = (
            stats.get('str', 0) +
            stats.get('dex', 0) +
            stats.get('int', 0) +
            stats.get('con', 0) +
            stats.get('wis', 0)
        )
        if stat_sum != 75:
            warnings.append(f"[{stalker_name}] 스탯 합계가 75가 아님: {stat_sum}")

    # 스킬 검증
    skills = stalker_data.get('skills', {})
    default_skills = skills.get('default', [])
    if not default_skills:
        warnings.append(f"[{stalker_name}] 기본 스킬 정보 누락")

    sub_skill = skills.get('sub', '')
    if not sub_skill:
        warnings.append(f"[{stalker_name}] 서브 스킬 정보 누락")

    ultimate_skill = skills.get('ultimate', '')
    if not ultimate_skill:
        warnings.append(f"[{stalker_name}] 궁극기 정보 누락")

    # 스킬 상세 정보 검증
    skill_details = stalker_data.get('skill_details', {})
    all_skill_ids = default_skills + [sub_skill, ultimate_skill]
    for skill_id in all_skill_ids:
        if skill_id and skill_id not in skill_details:
            warnings.append(f"[{stalker_name}] 스킬 상세 정보 누락: {skill_id}")

    # 기본 공격 검증
    basic_attacks = stalker_data.get('basic_attacks', {})
    if not basic_attacks:
        warnings.append(f"[{stalker_name}] 기본 공격 몽타주 정보 누락")

    # 경고 및 에러 출력
    for warning in warnings:
        logger.warning(warning)

    for error in errors:
        logger.error(error)

    return len(errors) == 0


def validate_collection_result(collection_data: Dict) -> bool:
    """
    전체 수집 결과 검증

    Args:
        collection_data: 전체 수집 데이터

    Returns:
        검증 성공 여부
    """
    stalkers = collection_data.get('stalkers', {})

    if not stalkers:
        logger.error("수집된 스토커 데이터가 없습니다")
        return False

    total_stalkers = len(stalkers)
    logger.info(f"총 {total_stalkers}명의 스토커 데이터 수집 완료")

    # 각 스토커별 검증
    all_valid = True
    for stalker_name, stalker_data in stalkers.items():
        if not validate_stalker_data(stalker_name, stalker_data):
            all_valid = False

    return all_valid


def log_collection_summary(collection_data: Dict, log_file_path: str):
    """
    수집 결과 요약 로그 생성

    Args:
        collection_data: 전체 수집 데이터
        log_file_path: 로그 파일 경로
    """
    stalkers = collection_data.get('stalkers', {})

    with open(log_file_path, 'w', encoding='utf-8') as f:
        f.write("=" * 80 + "\n")
        f.write("DS 전투 데이터 수집 결과 요약\n")
        f.write("=" * 80 + "\n\n")

        metadata = collection_data.get('collection_metadata', {})
        f.write(f"수집 시각: {metadata.get('collected_at', '')}\n")
        f.write(f"총 스토커 수: {len(stalkers)}\n\n")

        for stalker_name, stalker_data in stalkers.items():
            f.write("-" * 80 + "\n")
            f.write(f"스토커: {stalker_name}\n")
            f.write("-" * 80 + "\n")

            basic_info = stalker_data.get('basic_info', {})
            f.write(f"  이름: {basic_info.get('name', '')}\n")
            f.write(f"  직업: {basic_info.get('jobName', '')}\n")

            stats = stalker_data.get('stats', {})
            stat_sum = (
                stats.get('str', 0) +
                stats.get('dex', 0) +
                stats.get('int', 0) +
                stats.get('con', 0) +
                stats.get('wis', 0)
            )
            f.write(f"  스탯 합계: {stat_sum}\n")

            skills = stalker_data.get('skills', {})
            default_skills = skills.get('default', [])
            f.write(f"  기본 스킬 수: {len(default_skills)}\n")
            f.write(f"  서브 스킬: {skills.get('sub', '')}\n")
            f.write(f"  궁극기: {skills.get('ultimate', '')}\n")

            skill_details = stalker_data.get('skill_details', {})
            f.write(f"  수집된 스킬 상세 정보 수: {len(skill_details)}\n")

            # 각 스킬별 몽타주 수 집계
            total_skill_montages = 0
            for skill_id, skill_data in skill_details.items():
                montages = skill_data.get('montages', [])
                total_skill_montages += len(montages)

            f.write(f"  스킬 몽타주 총 수: {total_skill_montages}\n")

            basic_attacks = stalker_data.get('basic_attacks', {})
            total_basic_montages = sum(len(montages) for montages in basic_attacks.values())
            f.write(f"  기본 공격 몽타주 총 수: {total_basic_montages}\n")

            f.write("\n")

        f.write("=" * 80 + "\n")
        f.write("수집 완료\n")
        f.write("=" * 80 + "\n")

    logger.info(f"수집 요약 로그 생성 완료: {log_file_path}")
