import json
from typing import List, Dict, Any
import structlog

logger = structlog.get_logger("translation.allergen_service")


class AllergenService:
    """Allergen validation and formatting service for translation"""

    def __init__(self, allergens: List[Dict[str, Any]]):
        self.allergens = allergens
        self.allergens_json = json.dumps(allergens, ensure_ascii=False, separators=(",", ":"))
        self.valid_numbers = {allergen["number"] for allergen in allergens}

    def get_allergens_list(self) -> List[Dict[str, Any]]:
        return self.allergens

    def get_allergens_json(self) -> str:
        return self.allergens_json

    def validate_allergen_numbers(self, allergen_numbers: List[int]) -> List[int]:
        """Validate and filter allergen numbers"""
        if not isinstance(allergen_numbers, list):
            logger.warning("invalid_allergen_format", received_type=type(allergen_numbers).__name__)
            return []

        validated = []
        for num in allergen_numbers:
            if isinstance(num, int) and num in self.valid_numbers:
                validated.append(num)
            else:
                logger.warning("invalid_allergen_number", number=num)

        logger.debug("allergens_validated", input_count=len(allergen_numbers), valid_count=len(validated))
        return validated

    def get_allergen_names(self, allergen_numbers: List[int]) -> List[str]:
        """Get allergen names from numbers"""
        validated_numbers = self.validate_allergen_numbers(allergen_numbers)
        allergen_map = {allergen["number"]: allergen["name"] for allergen in self.allergens}

        names = [allergen_map[num] for num in validated_numbers if num in allergen_map]

        logger.debug("allergen_names_retrieved", numbers=validated_numbers, names=names)
        return names
