"""
runs all scripts
"""

import os
import re
import sys
import datetime
import pandas as pd

ROOT_PATH = str(os.environ.get("ROOT_DIR_GESTAO_MIDIA"))
sys.path.append(ROOT_PATH)

from app.utils.db.db_functions import (  # pylint: disable=wrong-import-position
    get_wp_blog,
    get_all_wp_blogs,
    get_no_galery_messages,
    get_no_galery_specific_message,
    get_ids_from_filenames,
    galery_insert_attachment_ids,
)

FILE_NAME_PATTERN = r"href=\'https://cdn\.pzw\.io/([^/]+\.\w{3})"
START_DATE = datetime.datetime.now()
START_DATE_STRING = START_DATE.strftime("%H:%M:%S do dia %d/%m/%Y")
HAS_ATTACHMENT_ERROR = []
ID_BLOG = None
ID_MSG = None

arguments = sys.argv
arguments.pop(0)

if len(arguments) > 0:
    for index, arg in enumerate(arguments):
        if not index and arg.isdigit() and len(arg) <= 2:
            ID_BLOG = arg

        elif index == 1 and arg.isdigit():
            ID_MSG = arg
        else:
            print(
                """Please provide optional arguments as follows:
                an int blog id as the first argument 
                and an optional int message id as second argument"""
            )
            sys.exit(1)


def php_serialize_array(array):
    """
    Serializes a Python list into a PHP-compatible serialized string.
    """
    serialized = f"a:{len(array)}:{{"
    for ind, value in enumerate(array):
        serialized += f'i:{ind};s:{len(str(value))}:"{value}";'
    serialized += "}"
    return serialized


def handle_specific_blog_or_msg(blog_id: int, message_id: int):
    """
    Handles query for specif blog or msg
    Args:
        blog_id:int = the id of the blog to be checked
        message_id: int = the id of the message to be checked
    """
    blog = get_wp_blog(blog_id)
    if len(blog) == 0:
        raise RuntimeError(f"There is no blog with id {blog_id}")
    (_, path) = blog[0]
    process_blog(blog_id, path, message_id)


def handle_all_blogs():
    """
    Handles queries for all media errored msgs from all blogs
    """
    blogs = get_all_wp_blogs()
    for blog_id, path in blogs:
        process_blog(blog_id, path)


def process_blog(blog_id: int, path: str, message_id: int | None = None):
    """
    processes the media errored messages from each blog
    Args:
        blog_id: int = the current blog's id,
        path: str = the current blog's path,
        message_id: int|None = optional current msg id to be checked
    """
    cliente = path.replace("/", "").capitalize()
    df_mensagens = pd.DataFrame([])
    if message_id:
        df_mensagens = get_no_galery_specific_message(blog_id, message_id)
    else:
        df_mensagens = get_no_galery_messages(blog_id)
    if not df_mensagens.empty:
        if len(HAS_ATTACHMENT_ERROR) == 0:
            HAS_ATTACHMENT_ERROR.append(1)
        print(
            f"""🟢🟢🟢
***{cliente}*** iniciando às {START_DATE_STRING}"""
        )
        df_mensagens["nomes_arquivos"] = df_mensagens["midia"].apply(
            lambda x: list(set(re.findall(FILE_NAME_PATTERN, x)))
        )
        msgs_id_list = []
        for _, row in df_mensagens.iterrows():
            post_id = row["post_id"]
            nomes_arquivos = row["nomes_arquivos"]
            id_list = get_ids_from_filenames(blog_id, nomes_arquivos)
            serialized_ids = php_serialize_array(id_list)
            galery_insert_attachment_ids(blog_id, post_id, serialized_ids)
            msgs_id_list.append(post_id)
        print(
            f"""🔵🔵🔵 IDs das {len(df_mensagens)} mensagens atualizadas:
🔵🔵🔵 {msgs_id_list}
                """
        )
        end_date = datetime.datetime.now()
        end_date_string = end_date.strftime("%H:%M:%S")
        duration = end_date - START_DATE
        print(
            f"""Finalizado às {end_date_string} com duração de {duration}
🔴🔴🔴                  
"""
        )
    if len(HAS_ATTACHMENT_ERROR) == 0:
        end_date = datetime.datetime.now()
        end_date_string = end_date.strftime("%H:%M:%S")
        duration = end_date - START_DATE
        print(
            f"""Finalizado sem atividade às {end_date_string} com duração de {duration}
🔴🔴🔴
"""
        )


if ID_BLOG:
    handle_specific_blog_or_msg(ID_BLOG, ID_MSG)
else:
    handle_all_blogs()
