diff --git a/custom_components/shopping_list_manager/data/category_loader.py b/custom_components/shopping_list_manager/data/category_loader.py index 8b13789..65c7f8f 100644 --- a/custom_components/shopping_list_manager/data/category_loader.py +++ b/custom_components/shopping_list_manager/data/category_loader.py @@ -1 +1,94 @@ +"""Category loader utility.""" +import json +import logging +import os +from typing import List, Dict, Any +_LOGGER = logging.getLogger(__name__) + + +def load_categories(component_path: str, country_code: str = None) -> List[Dict[str, Any]]: + """Load categories from JSON file. + + Args: + component_path: Path to the component directory + country_code: Country code from HA config (e.g., 'NZ', 'AU', 'US') + If None, loads default categories.json + + Returns: + List of category dictionaries + """ + # Try country-specific file first if country_code provided + if country_code: + country_file = os.path.join( + component_path, "data", f"categories_{country_code.lower()}.json" + ) + if os.path.exists(country_file): + categories_file = country_file + _LOGGER.debug("Using country-specific categories: %s", country_code) + else: + _LOGGER.debug( + "No country-specific categories found for %s, using default", + country_code + ) + categories_file = os.path.join(component_path, "data", "categories.json") + else: + categories_file = os.path.join(component_path, "data", "categories.json") + + try: + with open(categories_file, "r", encoding="utf-8") as f: + data = json.load(f) + + _LOGGER.info( + "Loaded categories version %s for region %s", + data.get("version", "unknown"), + data.get("region", "default") + ) + + return data.get("categories", []) + + except FileNotFoundError: + _LOGGER.error("Categories file not found: %s", categories_file) + return _get_fallback_categories() + except json.JSONDecodeError as err: + _LOGGER.error("Failed to parse categories file: %s", err) + return _get_fallback_categories() + except Exception as err: + _LOGGER.error("Unexpected error loading categories: %s", err) + return _get_fallback_categories() + + +def _get_fallback_categories() -> List[Dict[str, Any]]: + """Get minimal fallback categories if file loading fails. + + Returns: + List of basic category dictionaries + """ + _LOGGER.warning("Using fallback categories") + + return [ + { + "id": "produce", + "name": "Produce", + "icon": "mdi:fruit-cherries", + "color": "#4CAF50", + "sort_order": 1, + "system": True + }, + { + "id": "dairy", + "name": "Dairy", + "icon": "mdi:cheese", + "color": "#FFC107", + "sort_order": 2, + "system": True + }, + { + "id": "other", + "name": "Other", + "icon": "mdi:dots-horizontal", + "color": "#9E9E9E", + "sort_order": 99, + "system": True + } + ]