import gradio as gr

from utils.auth import AuthState, ClientConnector
from utils.components import Components, ComponentsFn
from utils.parser import Parser


def create_interface() -> gr.Blocks:
    auth_state = AuthState()
    auth_state.check_start_auth_status()

    # css = '.gradio-container {width: 60% !important}'
    css = '''
    .gradio-container {
        width: 70% !important;
        margin: 0 auto !important; /* Центрирование по горизонтали */
    }
    '''

    with gr.Blocks(css=css) as interface:
        gr.Markdown(Components.welcome_message_markdown)
        
        auth_state = gr.State(auth_state)
        chats_list = gr.State([])
        csv_names = gr.State([])

        dynamic_visible_components = ComponentsFn.get_dynamic_visible_components(auth_state.value, render=False)
        code, code_btn, password_2fa, password_2fa_btn, delete_session_btn = dynamic_visible_components

        with gr.Group():
            gr.Markdown('Авторизация')
            with gr.Row():
                with gr.Column():
                    session_type = Components.session_type_radio()
                    auth_status = Components.auth_status(value=auth_state.value.message)
                    with gr.Row():
                        auth_btn = Components.auth_btn()
                        delete_session_btn.render()
                    code.render()
                    code_btn.render()
                    password_2fa.render()
                    password_2fa_btn.render()

                with gr.Column():
                    api_id = Components.api_id()
                    api_hash = Components.api_hash()
                    phone_number = Components.phone_number()

        auth_btn.click(
            fn=ClientConnector.start_auth,
            inputs=[auth_state, api_id, api_hash],
            outputs=[auth_state],
        ).then(
            fn=ClientConnector.send_code,
            inputs=[auth_state, phone_number],
            outputs=[auth_state],
        ).then(
            fn=ComponentsFn.get_dynamic_visible_components,
            inputs=[auth_state],
            outputs=dynamic_visible_components,
        ).then(
            fn=ComponentsFn.update_status,
            inputs=[auth_state],
            outputs=[auth_status],
        )

        code_btn.click(
            fn=ClientConnector.verify_code,
            inputs=[auth_state, phone_number, code],
            outputs=[auth_state],
        ).then(
            fn=ComponentsFn.get_dynamic_visible_components,
            inputs=[auth_state],
            outputs=dynamic_visible_components,
        ).then(
            fn=ComponentsFn.update_status,
            inputs=[auth_state],
            outputs=[auth_status],
        )

        password_2fa_btn.click(
            fn=ClientConnector.verify_2fa,
            inputs=[auth_state, password_2fa],
            outputs=[auth_state],
        ).then(
            fn=ComponentsFn.get_dynamic_visible_components,
            inputs=[auth_state],
            outputs=dynamic_visible_components,
        ).then(
            fn=ComponentsFn.update_status,
            inputs=[auth_state],
            outputs=[auth_status],
        )

        delete_session_btn.click(
            fn=ComponentsFn.delete_session,
            inputs=[auth_state],
            outputs=None,
        ).then(
            fn=ComponentsFn.get_dynamic_visible_components,
            inputs=[auth_state],
            outputs=dynamic_visible_components,
        ).then(
            fn=ComponentsFn.update_status,
            inputs=[auth_state],
            outputs=[auth_status],
        )

        session_type.change(
            fn=ComponentsFn.update_auth_state_session_type,
            inputs=[auth_state, session_type],
            outputs=None,
        )


        with gr.Group():
            gr.Markdown('Парсинг')
            with gr.Row():
                with gr.Column():
                    with gr.Group():
                        gr.Markdown('Чаты для парсинга')
                        chats_usernames = Components.chats_usernames()
                        add_chat_btn = Components.add_chat_btn()
                        chats_list_status = Components.chats_list_status()
                with gr.Column():
                    with gr.Group():
                        gr.Markdown('Параметры парсинга')
                        parse_args = Components.get_parse_args()
                with gr.Column():
                    with gr.Group():
                        gr.Markdown('Результаты парсинга')
                        start_parse_btn = Components.start_parse_btn()
                        parse_status = Components.parse_status()
                        download_btn = Components.download_btn()

        add_chat_btn.click(
            fn=Parser.add_chat_to_chats_list,
            inputs=[auth_state, chats_usernames, chats_list, api_id, api_hash],
            outputs=[chats_list_status],
        )

        start_parse_btn.click(
            fn=Parser.parse_chats,
            inputs=[auth_state, chats_list, api_id, api_hash, *parse_args],
            outputs=[parse_status, csv_names],
        ).then(
            fn=ComponentsFn.update_download_btn,
            inputs=[csv_names],
            outputs=[download_btn],
        )

    return interface