import os
import yaml
from bs4 import BeautifulSoup
import json
import copy
import shutil

# Caminho para o arquivo _quarto.yml
quarto_config_file = "_quarto.yml"




with open(quarto_config_file) as f:

    quarto_config = yaml.safe_load(f)




# Extrair as informações do arquivo _quarto.yml


# funcao para iterar os capítulos
def extrair_arquivos_qmd(objeto, capitulos_arquivos_html):

    if isinstance(objeto, list):

        for elemento in objeto:

            extrair_arquivos_qmd(elemento, capitulos_arquivos_html)

    elif isinstance(objeto, dict):

        if 'part' in objeto:

            extrair_arquivos_qmd(objeto['part'], capitulos_arquivos_html)

        if 'chapters' in objeto:

            extrair_arquivos_qmd(objeto['chapters'], capitulos_arquivos_html)

    elif isinstance(objeto, str) and objeto.endswith('.qmd'):

        capitulos_arquivos_html.append(objeto[:-4])




# pegando o local dos arquivos html
pasta_livro_renderizado = quarto_config["project"]["output-dir"]


# pegando o campo controle-moan para verificar se é um dicionário
é_dicionário = quarto_config["controle-moan"]["dicionario"]


# pegando os capítulos
capitulos = quarto_config["book"]["chapters"]
capitulos_arquivo_html = []
extrair_arquivos_qmd(capitulos, capitulos_arquivo_html)






# altera os arquivos html
for index, output_file in enumerate(capitulos_arquivo_html):

    # Caminho completo para o arquivo HTML
    arquivo_html = os.path.join(pasta_livro_renderizado, output_file + ".html")

    # conta os elementos que serão uma referencia / Ele começa em 0 na abertura de um novo capítulo
    ref_num = 0

    # Abre o arquivo HTML
    with open(arquivo_html, "r", encoding="utf-8") as f:

        content = f.read()



    


    
    


        
    # Cria um objeto BeautifulSoup
    soup = BeautifulSoup(content, "html.parser")



    # Encontre a tag 'main' no documento
    main_tag = soup.find("main")


    # Crie o elemento script com os metadados
    script_tag = soup.new_tag('script', data="moan-metadados")

    #pegar apenas a url do livro
    url_livro = os.path.basename(pasta_livro_renderizado)
    script_tag.string = f'var metadados = {{livroUrl: "{url_livro}"}};'
    script_tag.string += f'var modelo_antigo = true;'


    # Adicione o script ao cabeçalho (head) do HTML
    soup.head.append(script_tag)

    



    # Se existir o ark, colocar os dados nas tags object do primeiro capítulo do livro
    if "ark" in quarto_config["moan-dados"] and index == 0:

        ark = quarto_config["moan-dados"]["ark"]

        # Substitua "." por "_p_" e "/" por "_b_" em 'ark'
        ark = ark.replace(".", "_p_").replace("/", "_b_")
        
        # Adicione "ark_dp_" ao início de 'ark'
        ark = "ark_dp_" + ark

        # Encontre as tags object com id "metadados_livro_yml" e "metadados_livro_json"
        obj_metadados_yml = main_tag.find("object", {"id": "metadados_livro_yml"})

        obj_metadados_json = main_tag.find("object", {"id": "metadados_livro_json"})

        if obj_metadados_yml and obj_metadados_json:

            # Defina o atributo "data" das tags object
            obj_metadados_yml["data"] = "https://ark.livro.online/yaml/" + ark + ".yml"
            
            obj_metadados_json["data"] = "https://ark.livro.online/json/" + ark + ".json"



    # Verifique se o arquivo "postos-de-venda.json" existe
    json_file_path = "postos-de-venda.json"

    if os.path.exists(json_file_path) and index == 0:

        # O arquivo JSON existe, abra-o e extraia as chaves e valores
        with open(json_file_path, "r", encoding="utf-8") as json_file:

            postos_de_venda = json.load(json_file)

            # Crie uma nova lista não ordenada para armazenar os links
            ul = soup.new_tag("ul", id="postos-de-venda")

            for key, value in postos_de_venda.items():
                li = soup.new_tag("li")

                # Verifica se "@" está presente no valor
                if "@" in value:
                    # Se "@" estiver presente, crie um link de e-mail (mailto)
                    link = soup.new_tag("a", href=f"mailto:{value}")
                    link.string = f"{key}: {value}"  # Texto do link é a chave seguida de dois pontos e o valor
                else:
                    # Se "@" não estiver presente, crie um link normal
                    link = soup.new_tag("a", href=value)
                    link.string = key  # Texto do link é a chave

                li.append(link)
                ul.append(li)

            # Encontre a tag "section" com ID "versão-impressa"
            section_versao_impressa = main_tag.find("section", id="versão-impressa")

            if section_versao_impressa:

                # Adicione a lista não ordenada de links à seção "versão-impressa"
                section_versao_impressa.append(ul)


            # Copie o arquivo JSON para a pasta especificada em "pasta_livro_renderizado"
            dest_file = os.path.join(pasta_livro_renderizado, "postos-de-venda.json")

            shutil.copy(json_file_path, dest_file)


            # Copiar a imagem og.jpg que está na pasta img e serve para usar no open graph

            # Pasta onde o arquivo og.jpg está localizado
            pasta_img = "img"


            # Caminho completo para o arquivo og.jpg
            caminho_original = os.path.join(pasta_img, "og.jpg")

            # Verifica se o arquivo og.jpg existe na pasta img
            if os.path.exists(caminho_original):

                # Caminho completo para a pasta de destino na pasta livro_renderizado
                caminho_destino = os.path.join(pasta_livro_renderizado, "img")

                # Certifica-se de que a pasta de destino exista
                os.makedirs(caminho_destino, exist_ok=True)

                # Copia o arquivo og.jpg para a pasta de destino
                shutil.copy(caminho_original, caminho_destino)

                print("Arquivo og.jpg foi copiado com sucesso.")
            else:
                print("O arquivo og.jpg não foi encontrado na pasta img.")



    # Coloca o conteudo dentro de uma div com id chamado de papel, substituindo o conteudo original da tag main pela div papel

    # Crie uma div com id "papel"
    div_papel = soup.new_tag('div', id='papel')

    # Copie a tag main
    main_content_copy = copy.copy(main_tag.contents)

    # Limpe o conteúdo da tag <main>
    main_tag.clear()
    
     # Adicione a cópia do conteúdo à div "papel"
    for item_copy in main_content_copy:
        div_papel.append(item_copy)

    # Acrescentar a div_papel na tag main
    main_tag.append(div_papel)

    # Salva o arquivo HTML modificado
    with open(arquivo_html, "w", encoding="utf-8") as f:

        f.write(str(soup))

    # Nos livros antigos que já possuía referencias, o arquivo com as referencias será copiado para a pasta do livro renderizado.
    origem = "ref_capitulos.json"

    destino = os.path.join(pasta_livro_renderizado, "ref_capitulos.json")

    # Copia o arquivo para a pasta de destino
    shutil.copy(origem, destino)