"""
Module: app_sidebar

This module defines the app_sidebar function for managing the sidebar interface.

Dependencies:
- streamlit: The Streamlit library for building web applications.
- PIL: Python Imaging Library for image processing.
- numpy: Library for numerical computing.
- pandas: Library for data manipulation and analysis.

Functions:
- app_sidebar: Function for managing the sidebar interface.
- configure: Function for configuring the agent and tools.
- content_and_context: Function for setting the content and context.
"""

import streamlit as st
from PIL import Image 
import numpy as np
import pandas as pd

def app_sidebar(controller):
    """
    Function for managing the sidebar interface.

    Args:
    - controller (Controller): An instance of the Controller class for handling user submissions and managing conversations.

    Returns:
    - None
    """
    with st.sidebar:
        st.header("Set Tools and Option. ")
        with st.expander("Configure the agent and tools"):
            configure(controller.agent_config)
        with st.expander("Set the Content and Context"):
            content_and_context(controller.agent_config)

def configure(agent_config):
    """
    Function for configuring the agent and tools.

    Args:
    - agent_config (AgentConfig): An instance of the AgentConfig class for managing configuration settings for the agent.

    Returns:
    - None
    """
    st.markdown("Change the agent's configuration here.")

    agent_config.url_endpoint = st.selectbox("Select Inference URL", agent_config.agent_urls)
    
    agent_config.log_enabled = st.checkbox("Enable Logging")

    agent_config.s_tool_checkboxes = [st.checkbox(f"{tool.name} --- {tool.description} ") for tool in agent_config.tool_loader.tools]

def content_and_context(agent_config):
    """
    Function for setting the content and context.

    Args:
    - agent_config (AgentConfig): An instance of the AgentConfig class for managing configuration settings for the agent.

    Returns:
    - None
    """
    agent_config.context = st.text_area("Context")

    agent_config.image = st.camera_input("Take a picture")

    img_file_buffer = st.file_uploader('Upload a PNG image', type='png')

    if img_file_buffer is not None:
        image_raw = Image.open(img_file_buffer)
        agent_config.image = np.array(image_raw)
        st.image(agent_config.image)
        
    uploaded_file = st.file_uploader("Choose a pdf", type='pdf')
    if uploaded_file is not None:
        agent_config.document = uploaded_file.getvalue()  
        st.write(agent_config.document)
        
    uploaded_txt_file = st.file_uploader("Choose a txt", type='txt')
    if uploaded_txt_file is not None:
        agent_config.document = uploaded_txt_file.getvalue() 
        st.write(agent_config.document)
        
    uploaded_csv_file = st.file_uploader("Choose a csv", type='csv')
    if uploaded_csv_file is not None:
        agent_config.document = uploaded_csv_file.getvalue() 
        st.write(agent_config.document)
                    
    uploaded_csv_file = st.file_uploader("Choose audio", type='wav')
    if uploaded_csv_file is not None:
        agent_config.document = uploaded_csv_file.getvalue() 
        st.write(agent_config.document)
        
    uploaded_csv_file = st.file_uploader("Choose video", type='avi')
    if uploaded_csv_file is not None:
        agent_config.document = uploaded_csv_file.getvalue() 
        st.write(agent_config.document)