""" Flashcards generator page definition """
import os

import streamlit as st

from constants import language_to_flag, languages
from flashcard import Flashcard, FlashcardGeneratorOpenAI


def create_flashcard(
    expression: str, input_language: str, output_language: str
) -> Flashcard:
    """
    Creates a Flashcard instance with given expression and languages.

    Args:
        expression (str): The expression to be included in the flashcard.
        input_language (str): The language of the input expression.
        output_language (str): The target language for translation.

    Returns:
        Flashcard: A new Flashcard instance.
    """
    return Flashcard(
        input_expression=expression,
        input_language=input_language,
        output_expression=None,
        output_language=output_language,
        example_usage=None,
    )


def create_toggle(col, original: str, translation: str, example: str):
    """
    Creates a toggle (expandable section) in the Streamlit app.

    Args:
        col: The Streamlit column where the toggle will be placed.
        original (str): The original expression to be displayed.
        translation (str): The translated expression.
        example (str): An example usage of the expression.
        id (str): A unique identifier for the toggle.
    """
    with col:
        with st.expander(original, expanded=st.session_state.expand_all):
            st.write(f"**{translation}**\n\n{example}")


def show_generator(generator: FlashcardGeneratorOpenAI):
    """
    Displays the flashcard generator interface in the Streamlit app.

    Args:
        generator (FlashcardGeneratorOpenAI): The flashcard generator object.
    """
    col1, col2 = st.columns(2)
    with col1:
        input_language = st.selectbox(
            "Select an input language:", languages, index=languages.index("English")
        )
    with col2:
        output_language = st.selectbox(
            "Select an output language:", languages, index=languages.index("Polish")
        )

    if "input_language" not in st.session_state:
        st.session_state.input_language = input_language
    st.session_state.input_language = input_language

    if "output_language" not in st.session_state:
        st.session_state.output_language = output_language
    st.session_state.output_language = output_language

    expression = st.text_input(
        "Expression",
        placeholder="Enter an expression and press Enter to generate a flashcard",
    )

    if expression and not any(
        flashcard.input_expression == expression
        for flashcard in st.session_state.flashcards.data
    ):
        new_flashcard = generator.generate_flashcard(
            expression, input_language, output_language
        )
        st.session_state.flashcards.data.append(new_flashcard)


def show_expand_button():
    """
    Displays a button to expand or collapse all flashcards in the Streamlit app.
    """
    if st.button("Expand/Collapse All"):
        st.session_state.expand_all = not st.session_state.expand_all


def show_flashcards():
    """
    Displays the generated flashcards in the Streamlit app.
    """
    if len(st.session_state.flashcards) == 0:
        st.info("Generate a flashcard or import a file with previously generated ones")
    else:
        col1, col2 = st.columns(2)
        for idx, flashcard in enumerate(st.session_state.flashcards.data):
            create_toggle(
                col1 if idx % 2 == 0 else col2,
                f"{language_to_flag[flashcard.input_language]} {flashcard.input_expression}",
                f"{language_to_flag[flashcard.output_language]} {flashcard.output_expression}",
                f"{flashcard.example_usage}",
            )


def show_generator_page():
    """
    Sets up the main page of the Streamlit app for the flashcard generator.
    """
    generator = FlashcardGeneratorOpenAI(api_key=os.environ["OPENAI_API_KEY"])

    st.title("Flashcards generator")
    show_generator(generator)

    st.divider()
    show_expand_button()
    show_flashcards()