from typing import Optional

from allensdk.brain_observatory.ophys.project_constants import (
    NUM_DEPTHS_DICT, NUM_STRUCTURES_DICT)


############################
#
#     from session type
#
############################


def parse_behavior_context(session_type: str) -> str:
    """Return if session is passive or active.

    Parameters
    ----------
    session_type : str
        String session type name.

    Returns
    -------
    behavior_type : str
        Return string describing active or passive session.
    """
    is_passive = "passive" in session_type and "OPHYS" in session_type
    if is_passive:
        behavior_type = "passive_viewing"
    else:
        behavior_type = "active_behavior"
    return behavior_type


def parse_stimulus_set(session_type: str) -> str:
    """Return the name of the image set or gratings.

    Parameters
    ----------
    session_type : str
        String session type name.

    Returns
    -------
    stim_set : str
        Name of stimulus set shown for session.
    """
    session_type_split = session_type.split("_")
    stimulus_type = session_type_split[2]
    if stimulus_type == "images":
        image_set_letter = session_type_split[3]
        stim_set = f"{stimulus_type}_{image_set_letter}"
    elif stimulus_type == "gratings":
        stim_set = "gratings"
    else:
        raise ValueError(
            f"Session_type {session_type} not formatted as " "expected."
        )
    return stim_set


############################
#
#     from project code
#
############################


def parse_num_cortical_structures(project_code: str) -> Optional[str]:
    """Return the number of structures that were targeted for this session.

    Parameters
    ----------
    project_code : str
        Full project name of the experiment.

    Returns
    -------
    num_structures : int
        Number of structures targeted for the session.
    """
    return NUM_STRUCTURES_DICT.get(project_code, None)


def parse_num_depths(project_code: str) -> Optional[str]:
    """Return the number of depths that were imaged for the session.

    Parameters
    ----------
    project_code : str
        Full project name of the experiment.

    Returns
    -------
    num_depths : int
        Number of depths imaged for the session.
    """
    return NUM_DEPTHS_DICT.get(project_code, None)
