"""JSONSchema spec readers module."""
from pathlib import Path
from typing import Any
from typing import Hashable
from typing import Mapping
from typing import Tuple

from jsonschema_path.handlers import all_urls_handler
from jsonschema_path.handlers import file_handler
from jsonschema_path.handlers.protocols import SupportsRead


class BaseReader:
    def read(self) -> Tuple[Mapping[Hashable, Any], str]:
        raise NotImplementedError


class FileReader(BaseReader):
    def __init__(self, fileobj: SupportsRead):
        self.fileobj = fileobj

    def read(self) -> Tuple[Mapping[Hashable, Any], str]:
        return file_handler(self.fileobj), ""


class PathReader(BaseReader):
    def __init__(self, path: Path):
        self.path = path

    def read(self) -> Tuple[Mapping[Hashable, Any], str]:
        if not self.path.is_file():
            raise OSError(f"No such file: {self.path}")

        uri = self.path.as_uri()
        return all_urls_handler(uri), uri


class FilePathReader(PathReader):
    def __init__(self, file_path: str):
        path = Path(file_path).absolute()
        super().__init__(path)
