#!/usr/bin/env python3
"""Validate a breakdown.json against the schema."""
import json
import sys
from pathlib import Path

RECOIL_ROOT = Path(__file__).resolve().parent.parent
SCHEMA_PATH = RECOIL_ROOT / 'schemas' / 'breakdown_schema_v1.json'


def validate_breakdown(breakdown_path: Path) -> dict:
    """Validate a breakdown JSON file.

    Returns: {valid: bool, errors: [], warnings: []}
    """
    errors = []
    warnings = []

    try:
        breakdown = json.loads(breakdown_path.read_text())
    except json.JSONDecodeError as e:
        return {'valid': False, 'errors': [f'Invalid JSON: {e}'], 'warnings': []}

    # Required fields
    for field in ('episode_id', 'format', 'beats', 'global_audio'):
        if field not in breakdown:
            errors.append(f'Missing required field: {field}')

    if errors:
        return {'valid': False, 'errors': errors, 'warnings': warnings}

    # Episode ID format
    if not breakdown['episode_id'].startswith('ep_'):
        errors.append(f"episode_id must start with 'ep_': got '{breakdown['episode_id']}'")

    # Beats validation
    beats = breakdown.get('beats', [])
    if not beats:
        errors.append('No beats in breakdown')

    valid_beat_ids = {'entry_image', 'voice', 'linger', 'break', 'aftermath'}
    total_shots = 0
    for beat in beats:
        beat_id = beat.get('beat_id', '')
        if beat_id not in valid_beat_ids:
            errors.append(f"Invalid beat_id: '{beat_id}'")

        shots = beat.get('shots', [])
        if not shots:
            warnings.append(f"Beat '{beat_id}' has no shots")
        total_shots += len(shots)

        for shot in shots:
            if not shot.get('shot_id'):
                errors.append(f"Shot in beat '{beat_id}' missing shot_id")
            if not shot.get('action'):
                warnings.append(f"Shot '{shot.get('shot_id', '?')}' has no action description")

    # Shot count check (Puzzle Box: 2-7 shots)
    if total_shots < 2:
        warnings.append(f'Only {total_shots} shots — minimum is 2')
    if total_shots > 7:
        warnings.append(f'{total_shots} shots — maximum is 7 for standard episodes')

    # Global audio
    audio = breakdown.get('global_audio', {})
    if not audio.get('ambient_bed'):
        warnings.append('No ambient_bed specified in global_audio')

    return {
        'valid': len(errors) == 0,
        'errors': errors,
        'warnings': warnings,
        'metrics': {
            'total_shots': total_shots,
            'beat_count': len(beats),
            'has_vo': bool(audio.get('vo_text'))
        }
    }


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Usage: validate_breakdown.py <breakdown.json>")
        sys.exit(1)

    result = validate_breakdown(Path(sys.argv[1]))
    print(json.dumps(result, indent=2))
    sys.exit(0 if result['valid'] else 1)
