from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton
from PyQt5.QtCore import Qt
from ..utils.db import *
from ..agent.chat_history import clear_chat_history

def settings_popup(self):
    """
    Display a settings popup dialog for configuring various options.

    This function creates a settings dialog with options to reset chat history, enable/disable the just text model,
    and change the active profile.

    Parameters:
    - self: Reference to the main application window.

    Returns:
    - None
    """
    from ..gpt_computer_assistant import the_main_window

    settings_dialog = QDialog()
    settings_dialog.setWindowTitle("Settings")
    settings_dialog.setWindowModality(Qt.ApplicationModal)

    settings_dialog.setLayout(QVBoxLayout())

    reset_memory_button = QPushButton("Reset Memory")

    def clear_chat_history_():
        """
        Clear the chat history and update the main window.

        This function clears the chat history and updates the main window with a notification.

        Returns:
        - None
        """
        clear_chat_history()
        the_main_window.update_from_thread("Cleared Chat History")
        settings_dialog.close()

    reset_memory_button.clicked.connect(clear_chat_history_)
    settings_dialog.layout().addWidget(reset_memory_button)

    just_text_button = QPushButton("Enable Just Text Model")

    settings_dialog.layout().addWidget(just_text_button)

    if is_just_text_model_active():
        just_text_button.setText("Disable Just Text Model")

        def deactivate_just_text_model_():
            """
            Deactivate the just text model and update the main window.

            This function deactivates the just text model and updates the main window with a notification.

            Returns:
            - None
            """
            deactivate_just_text_model()
            the_main_window.update_from_thread("Disabled Just Text Model")
            settings_dialog.close()

        just_text_button.clicked.connect(deactivate_just_text_model_)
    else:

        def activate_just_text_model_():
            """
            Activate the just text model and update the main window.

            This function activates the just text model and updates the main window with a notification.

            Returns:
            - None
            """
            activate_just_text_model()
            the_main_window.update_from_thread("Enabled Just Text Model")
            settings_dialog.close()

        just_text_button.clicked.connect(activate_just_text_model_)

    settings_dialog.layout().addWidget(QLabel("Profile"))
    profile_input = QLineEdit()

    profile_input.setText(get_profile())
    settings_dialog.layout().addWidget(profile_input)
    profile_save_button = QPushButton("Save")

    def set_profile_(profile):
        """
        Set the active profile and update the main window.

        This function sets the active profile based on user input and updates the main window with a notification.

        Parameters:
        - profile (str): The profile name to set.

        Returns:
        - None
        """
        set_profile(profile)
        the_main_window.update_from_thread("Saved Profile")
        settings_dialog.close()

    profile_save_button.clicked.connect(lambda: set_profile_(profile_input.text()))
    settings_dialog.layout().addWidget(profile_save_button)


    dark_mode_button = QPushButton("Enable Dark Mode")

    settings_dialog.layout().addWidget(dark_mode_button)

    if is_dark_mode_active():
        dark_mode_button.setText("Disable Dark Mode")

        def deactivate_dark_mode_():
            """
            Deactivate dark mode and update the main window.

            This function deactivates dark mode and updates the main window with a notification.

            Returns:
            - None
            """
            deactivate_dark_mode()
            the_main_window.update_from_thread("Disabled Dark Mode")
            the_main_window.light_mode()
            settings_dialog.close()

        dark_mode_button.clicked.connect(deactivate_dark_mode_)
    else:

            def activate_dark_mode_():
                """
                Activate dark mode and update the main window.

                This function activates dark mode and updates the main window with a notification.

                Returns:
                - None
                """
                activate_dark_mode()
                the_main_window.update_from_thread("Enabled Dark Mode")
                the_main_window.dark_mode()
                settings_dialog.close()

            dark_mode_button.clicked.connect(activate_dark_mode_)




    predefined_agents_button = QPushButton("Enable Predefined Agents (Good Results, Long Response Time)")

    settings_dialog.layout().addWidget(predefined_agents_button)

    try:
        import crewai
        if is_predefined_agents_setting_active():
            predefined_agents_button.setText("Disable Predefined Agents (Bad Results, Short Response Time)")

            def deactivate_predefined_agents_():
                deactivate_predefined_agents_setting()
                the_main_window.update_from_thread("Disabled Predefined Agents (Bad Results, Short Response Time)")
                settings_dialog.close()

            predefined_agents_button.clicked.connect(deactivate_predefined_agents_)
        else:

                def activate_predefined_agents_():
                    activate_predefined_agents_setting()
                    the_main_window.update_from_thread("Enabled Predefined Agents (Good Results, Long Response Time)")
                    settings_dialog.close()

                predefined_agents_button.clicked.connect(activate_predefined_agents_)

    except:
         predefined_agents_button.setText("Install gpt-computer-assistant[agentic]")






    online_tools_button = QPushButton("Enable Upsonic Tiger Tools - More Capability (Recommended)")

    settings_dialog.layout().addWidget(online_tools_button)

    if is_online_tools_setting_active():
        online_tools_button.setText("Disable Upsonic Tiger Tools - Low Capability (Not Recommended)")

        def deactivate_online_tools_():
            deactivate_online_tools_setting()
            the_main_window.update_from_thread("Disabled Upsonic Tiger Tools - Low Capability (Not Recommended)")
            settings_dialog.close()

        online_tools_button.clicked.connect(deactivate_online_tools_)
    else:

            def activate_online_tools_():
                activate_online_tools_setting()
                the_main_window.update_from_thread("Enabled Upsonic Tiger Tools - More Capability (Recommended)")
                settings_dialog.close()

            online_tools_button.clicked.connect(activate_online_tools_)





    auto_stop_recording_button = QPushButton("Enable Auto Stop Recording")

    settings_dialog.layout().addWidget(auto_stop_recording_button)

    if is_auto_stop_recording_setting_active():
        auto_stop_recording_button.setText("Disable Auto Stop Recording")

        def deactivate_auto_stop_recording_():
            deactivate_auto_stop_recording_setting()
            the_main_window.update_from_thread("Disabled Auto Stop Recording")
            settings_dialog.close()

        auto_stop_recording_button.clicked.connect(deactivate_auto_stop_recording_)
    else:

            def activate_auto_stop_recording_():
                activate_auto_stop_recording_setting()
                the_main_window.update_from_thread("Enabled Auto Stop Recording")
                settings_dialog.close()

            auto_stop_recording_button.clicked.connect(activate_auto_stop_recording_)





    api_key_label = QLabel("Wakeword - Pvporcupine API Key")
    settings_dialog.layout().addWidget(api_key_label)
    api_key_input = QLineEdit()
    api_key = load_pvporcupine_api_key()
    api_key_input.setText(api_key)
    settings_dialog.layout().addWidget(api_key_input)
    save_button = QPushButton("Save")

    def save_api_key_(api_key):
        first_time = True
        if api_key != "CHANGE_ME":
            first_time = False
        save_pvporcupine_api_key(api_key)

        the_main_window.update_from_thread("Wake word activated, just say 'Her Computer' or jarvis to activate the assistant")
        if first_time:
            the_main_window.wake_word_trigger()
        settings_dialog.close()

    save_button.clicked.connect(lambda: save_api_key_(api_key_input.text()))
    settings_dialog.layout().addWidget(save_button)





    wake_word_button = QPushButton("Enable Wake Word")

    settings_dialog.layout().addWidget(wake_word_button)

    missing_parts = False
    try:
         import pyaudio
    except:
        missing_parts = True


    if api_key == "CHANGE_ME":
        wake_word_button.setText("Please Set Pvporcupine API Key First")
    elif missing_parts:
        wake_word_button.setText("Please Install gpt-computer-assistant[wakeword]")
    else:

        if is_wake_word_active():
            wake_word_button.setText("Disable Wake Word")

            def deactivate_wake_word_():
                deactivate_wake_word()
                the_main_window.update_from_thread("Disabled Wake Word")
                the_main_window.wake_word_active = False
                settings_dialog.close()

            wake_word_button.clicked.connect(deactivate_wake_word_)
        else:

                def activate_wake_word_():
                    activate_wake_word()
                    the_main_window.update_from_thread("Enabled Wake Word")
                    the_main_window.wake_word_active = True
                    the_main_window.wake_word_trigger()
                    settings_dialog.close()

                wake_word_button.clicked.connect(activate_wake_word_)





    wake_word_screen_button = QPushButton("Enable Screen Input for Wake Word Mode")

    settings_dialog.layout().addWidget(wake_word_screen_button)

    if is_wake_word_screen_setting_active():
        wake_word_screen_button.setText("Disable Screen Input for Wake Word Mode")

        def deactivate_auto_stop_recording_():
            deactivate_wake_word_screen_setting()
            the_main_window.update_from_thread("Disabled Screen Input for Wake Word Mode")
            settings_dialog.close()

        wake_word_screen_button.clicked.connect(deactivate_auto_stop_recording_)
    else:

            def activate_auto_stop_recording_():
                activate_wake_word_screen_setting()
                the_main_window.update_from_thread("Enabled Screen Input for Wake Word Mode")
                settings_dialog.close()

            wake_word_screen_button.clicked.connect(activate_auto_stop_recording_)




    continuously_conversations_button = QPushButton("Enable Continuously Conversations")

    settings_dialog.layout().addWidget(continuously_conversations_button)

    if is_continuously_conversations_setting_active():
        continuously_conversations_button.setText("Disable Continuously Conversations")

        def deactivate_auto_stop_recording_():
            deactivate_continuously_conversations_setting()
            the_main_window.update_from_thread("Disabled Continuously Conversations")
            settings_dialog.close()

        continuously_conversations_button.clicked.connect(deactivate_auto_stop_recording_)
    else:

            def activate_auto_stop_recording_():
                activate_continuously_conversations_setting()
                the_main_window.update_from_thread("Enabled Continuously Conversations")
                settings_dialog.close()

            continuously_conversations_button.clicked.connect(activate_auto_stop_recording_)

    settings_dialog.exec_()