"""importer に共通の型（取り込みの文脈・結果）."""

import sqlite3
from dataclasses import dataclass
from pathlib import Path
from typing import Protocol

from tiasdata.config import SourceConfig
from tiasdata.importers.reviews import Reviews


@dataclass(frozen=True)
class ImportContext:
    """importer に渡す取り込みの文脈．

    Attributes:
        source_name: 取り込み元の名前（設定ファイルの `sources.<名前>`）．
        source: 取り込み元の設定．
        store_dir: ストアのフォルダ．
        reviews: 要確認リスト（番号 → 理由等）．
        show_source_names: エラーメッセージに取り込み元の番号・名前を出すか
            （原因の特定に必要なときだけ明示する．error-handling.md）．
    """

    source_name: str
    source: SourceConfig
    store_dir: Path
    reviews: Reviews
    show_source_names: bool = False


@dataclass(frozen=True)
class ImportResult:
    """取り込みの結果（件数だけ．CLI がそのまま表示する）．

    Attributes:
        source_name: 取り込み元の名前．
        importer: importer の名前．
        found: 取り込み元で見つけた画像の数（要確認の番号を含む）．
        review_numbers: 要確認リストの番号の数．
        review_filename: 要確認リストのファイル名（`reviews/<名前>.toml`）．
        unused_map_rows: 対応表で番号が整数でないため使わなかった行の行番号（xlsx の 1 始まり．
            位置であり対応表の中身ではない．表示は件数だけで，行番号は
            `--show-source-names` を指定したときだけ出す）．
        skipped_existing: 既に登録済みで飛ばした数（撮影にひも付けないファイルは 1 つで 1 件）．
        copied_to_store: ストアにコピーした数（同じ中身が既にあったものは含まない）．
        subjects_added: 登録した症例の数．
        captures_added: 登録した撮影の数．
        assets_added: 登録したファイルの数．
        annotations_added: 登録した所見の数（要確認の印を含む）．
        derivations_added: 登録した由来の数．
        reviewed_added: 要確認として登録した数（撮影と，撮影にひも付けないファイル）．
        unlinked_files_added: 登録した撮影にひも付けないファイルの数．
        unlinked_numbers_added: 登録した撮影にひも付けないファイルの，取り込み元での番号の数．
        review_marks_added: 登録済みの撮影・撮影にひも付けないファイルに足した要確認の印の数．
        review_marks_stale: 要確認リストから外れたのに有効な要確認の印が残っている撮影の数
            （印は外さない．外すのは編集のコマンド）．
    """

    source_name: str
    importer: str
    found: int
    review_numbers: int
    review_filename: str
    unused_map_rows: tuple[int, ...]
    skipped_existing: int
    copied_to_store: int
    subjects_added: int
    captures_added: int
    assets_added: int
    annotations_added: int
    derivations_added: int
    reviewed_added: int
    unlinked_files_added: int
    unlinked_numbers_added: int
    review_marks_added: int
    review_marks_stale: int


class Importer(Protocol):
    """importer の関数の形（対応表を ATTACH した目録の接続と文脈を受け取る）．"""

    def __call__(self, conn: sqlite3.Connection, context: ImportContext) -> ImportResult: ...
