from __future__ import annotations

from dataclasses import dataclass
from typing import Iterable, Optional

import pandas as pd

from classes.v2.data_bundle import DataBundle
from classes.v2.papila_builders import build_papila_data


@dataclass
class PapilaData:
    """
    V2-friendly wrapper around the DataBundle pipeline.

    Keeps all formatting/normalization behavior from build_papila_clinical,
    but exposes a minimal surface area for the V2 engine.
    """

    clinical: DataBundle
    patient_col: str = "Patient ID"

    @property
    def df(self) -> pd.DataFrame:
        return self.clinical.df

    @property
    def label_col(self) -> str:
        return self.clinical.label_col

    @property
    def feature_dim(self) -> int:
        return self.clinical.feature_dim

    def get_image_path(self, row: pd.Series):
        return self.clinical.get_image_path(row)

    def vectorize_row(self, row: pd.Series):
        return self.clinical.vectorize_row(row)

    @classmethod
    def from_dirs(
        cls,
        *,
        image_dir: str,
        clinical_dir: str,
        label_col: str,
        cat_cols: Iterable[str],
        n_splits: int = 5,
        random_seed: int = 42,
    ) -> "PapilaData":
        clinical = build_papila_data(
            image_dir=image_dir,
            clinical_dir=clinical_dir,
            label_col=label_col,
            cat_cols=list(cat_cols),
            n_splits=n_splits,
            random_seed=random_seed,
        )
        return cls(clinical=clinical)
