"""
Configuration management for VocabListGenerator
"""

import sys
import yaml
from typing import Dict, Any, List


class Config:
    """Configuration loader and validator for VocabListGenerator"""

    def __init__(self, config_path: str = "conf"):
        self.config_path = config_path
        self.data = self._load_config()
        self._validate_config()

    def _load_config(self) -> Dict[str, Any]:
        """Load configuration from YAML file"""
        try:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                return yaml.safe_load(f)
        except FileNotFoundError:
            print(f"Configuration file '{self.config_path}' not found!")
            sys.exit(1)
        except yaml.YAMLError as e:
            print(f"Error parsing configuration file: {e}")
            sys.exit(1)

    def _validate_config(self):
        """Validate required configuration fields"""
        if self.data is None:
            print(f"Configuration file '{self.config_path}' is empty or invalid!")
            sys.exit(1)

        for section in ['llm', 'vocab']:
            if section not in self.data:
                print(f"Missing required section '{section}' in conf")
                sys.exit(1)

        vocab = self.data['vocab']

        if 'languages' not in vocab or not isinstance(vocab['languages'], list) or len(vocab['languages']) != 2:
            print("conf: 'vocab.languages' must contain exactly 2 language IDs (first and second language)")
            sys.exit(1)

        if 'amount' not in vocab or not isinstance(vocab['amount'], int) or vocab['amount'] < 1:
            print("conf: 'vocab.amount' must be a positive integer")
            sys.exit(1)

        if 'category' not in vocab or not vocab['category']:
            print("conf: 'vocab.category' must be a non-empty string")
            sys.exit(1)

    @property
    def llm_config(self) -> Dict[str, Any]:
        """LLM connection settings"""
        return self.data['llm']

    @property
    def vocab_config(self) -> Dict[str, Any]:
        """Vocabulary generator settings"""
        return self.data['vocab']

    @property
    def manifest_config(self) -> Dict[str, Any]:
        """Manifest settings (optional section)"""
        return self.data.get('manifest', {})
