import json
from pathlib import Path
from typing import Any, Dict, Optional, Tuple

from .info_schemas import REPO_SCHEMA, update_mixin
from .log import log


class RepoJSONMixin:
    INFO_FILE_NAME = "info.json"

    def __init__(self, repo_folder: Path, *, info_file: Optional[Path] = None):
        self._repo_folder = repo_folder

        self.author: Tuple[str, ...]
        self.install_msg: str
        self.short: str
        self.description: str

        self._info_file = info_file or repo_folder / self.INFO_FILE_NAME
        self._info: Dict[str, Any]

        self._read_info_file()

    def _read_info_file(self) -> None:
        if self._info_file.exists():
            try:
                with self._info_file.open(encoding="utf-8") as f:
                    info = json.load(f)
            except json.JSONDecodeError as e:
                log.error(
                    "Invalid JSON information file at path: %s\nError: %s", self._info_file, str(e)
                )
                info = {}
        else:
            info = {}
        if not isinstance(info, dict):
            log.warning(
                "Invalid top-level structure (expected dict, got %s)"
                " in JSON information file at path: %s",
                type(info).__name__,
                self._info_file,
            )
            info = {}
        self._info = info

        update_mixin(self, REPO_SCHEMA)
