"""Базовый интерфейс для всех читателей документов."""
from __future__ import annotations

import os
from abc import ABC, abstractmethod
from dataclasses import dataclass
from pathlib import Path
from typing import Optional


@dataclass
class ReaderOutcome:
    """Результат попытки извлечения текста из файла."""

    text: Optional[str] = None
    warning: Optional[str] = None
    error: Optional[str] = None
    locked: bool = False
    method_used: str = ""

    @property
    def ok(self) -> bool:
        return self.text is not None and not self.error


class BaseReader(ABC):
    """Абстрактный читатель. Реализация должна быть потокобезопасной (без
    разделяемого мутируемого состояния), т.к. вызывается из пула потоков."""

    name: str = "base"

    @abstractmethod
    def extract_text(self, path: Path) -> ReaderOutcome:
        ...

    @staticmethod
    def is_file_accessible(path: Path) -> bool:
        """Проверка, что файл не заблокирован другим процессом на запись/чтение."""
        try:
            with open(path, "rb"):
                return True
        except (PermissionError, OSError):
            return False

    @staticmethod
    def read_bytes(path: Path) -> Optional[bytes]:
        try:
            with open(path, "rb") as fh:
                return fh.read()
        except (PermissionError, OSError):
            return None
