from typing import Sequence, List, TYPE_CHECKING, Optional, Iterator
if TYPE_CHECKING:
    from pyfileconf.sectionpath.sectionpath import SectionPath
from pyfileconf.interfaces import SectionPathLike
from pyfileconf.pmcontext.actions import PyfileconfActions
[docs]class PyfileconfFrame:
[docs]    def __init__(
        self,
        section_path: SectionPathLike,
        action: PyfileconfActions,
        file_path: Optional[str] = None,
    ):
        from pyfileconf.sectionpath.sectionpath import SectionPath
        self.section_path = SectionPath.from_ambiguous(section_path)
        self.action = action
        self.file_path = file_path 
    def __repr__(self):
        return (
            f"<PyfileconfFrame(section_path={self.section_path.path_str}, "
            f"action={self.action.value}, file_path={self.file_path})>"
        )
[docs]    @classmethod
    def from_file_path(cls, file_path: str, action: PyfileconfActions):
        from pyfileconf import PipelineManager
        from pyfileconf.sectionpath.sectionpath import SectionPath
        dependent_manager = PipelineManager.get_manager_by_filepath(file_path)
        dependent_sp = SectionPath.from_filepath(
            dependent_manager.default_config_path, file_path
        )
        full_sp = SectionPath.join(dependent_manager.name, dependent_sp)
        return cls(full_sp, action, file_path=file_path)  
[docs]class PyfileconfStack:
    frames: List[PyfileconfFrame]
[docs]    def __init__(self, frames: Sequence[PyfileconfFrame]):
        self.frames = list(frames) 
    def __getitem__(self, item) -> PyfileconfFrame:
        return self.frames[item]
    def __iter__(self) -> Iterator[PyfileconfFrame]:
        yield from self.frames
    def __repr__(self):
        frame_repr = "\n".join(f"{i}\t{repr(frame)}" for i, frame in enumerate(self))
        return f"<PyfileconfStack(\n{frame_repr}\n)>"
[docs]    def add_frame(self, frame: PyfileconfFrame):
        self.frames.append(frame) 
[docs]    def pop_frame(self) -> PyfileconfFrame:
        return self.frames.pop(-1) 
[docs]    def add_running_item(self, section_path: SectionPathLike):
        frame = PyfileconfFrame(section_path, PyfileconfActions.RUN)
        self.add_frame(frame) 
    @property
    def currently_running_section_path_str(self) -> Optional[str]:
        run_frames = [frame for frame in self if frame.action == PyfileconfActions.RUN]
        if not run_frames:
            return None
        return run_frames[-1].section_path.path_str
    @property
    def file_is_currently_being_loaded(self) -> bool:
        load_frames = [
            frame
            for frame in self
            if frame.action == PyfileconfActions.LOAD_FILE_EXECUTE
        ]
        return len(load_frames) > 0
    @property
    def currently_loading_file_section_path(self) -> Optional["SectionPath"]:
        load_frames = [
            frame
            for frame in self
            if frame.action == PyfileconfActions.LOAD_FILE_EXECUTE
        ]
        if not load_frames:
            return None
        return load_frames[-1].section_path