import pandas as pd
import unicodedata
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext

def remover_acentos(texto):
    return (unicodedata.normalize('NFD', texto)
            .encode('ascii', 'ignore')
            .decode('utf-8')) if isinstance(texto, str) else texto

def limpar_dataframe(df):
    df = df.fillna("")
    df = df.astype({col: str for col in df.select_dtypes(include='int64')})
    df[df.select_dtypes(include='float').columns] = df.select_dtypes(include='float').round(2)
    df[df.select_dtypes(include='object').columns] = df.select_dtypes(include='object').applymap(remover_acentos)
    return df

def formatar_cabecalho(colunas, ignorar):
    return [remover_acentos(c).upper().replace(" ", "_").replace("/", "_")
            for i, c in enumerate(colunas) if i not in ignorar]

def converter_via_pandas(arq_csv, arq_xlsx, log_func=None):
    try:
        df = pd.read_excel(arq_xlsx, sheet_name='cClass', dtype={col: str for col in [
            "CST-IBS/CBS", "cClassTrib", "pRedIBS", "pRedCBS", 
            "ind_RedutorBC", "ind_gTribRegular", "ind_CredPres", 
            "indMono", "indMonoReten", "indMonoRet", "indMonoDif"
        ]})
        
        df = limpar_dataframe(df)
        ignorar_colunas = [0, 1, 4, 5]
        csv_cabec = formatar_cabecalho(df.columns, ignorar_colunas)
        csv_dados = []

        mapeamento = {"Fornecedor": "01", "Adquirente": "02"}

        for _, linha in df.iterrows():
            dados = []
            for i, dado in enumerate(linha):
                if i in ignorar_colunas:
                    continue
                dado = str(dado).replace("\n", "")
                if i == 17:
                    dado = next((v for k, v in mapeamento.items() if k in dado), "99")
                dados.append(dado)
            csv_dados.append(dados)

        with open(arq_csv, "w", encoding='utf-8') as f:
            f.write(";".join(csv_cabec) + "\n")
            for linha in csv_dados:
                f.write(";".join(linha) + "\n")

        if log_func:
            log_func("Conversão concluída com sucesso.")
    except Exception as e:
        if log_func:
            log_func(f"Erro: {str(e)}")
        else:
            print(f"Erro: {str(e)}")

def iniciar_interface():
    def selecionar_xlsx():
        arquivo = filedialog.askopenfilename(filetypes=[("Planilhas Excel", "*.xlsx")])
        if arquivo:
            entrada_var.set(arquivo)

    def selecionar_csv():
        arquivo = filedialog.asksaveasfilename(defaultextension=".csv", filetypes=[("Arquivos CSV", "*.csv")])
        if arquivo:
            saida_var.set(arquivo)

    def log(msg):
        txt_log.insert(tk.END, msg + "\n")
        txt_log.see(tk.END)

    def executar():
        entrada = entrada_var.get()
        saida = saida_var.get()
        if not entrada or not saida:
            messagebox.showwarning("Atenção", "Informe os dois caminhos.")
            return
        txt_log.delete(1.0, tk.END)
        log("Iniciando conversão...")
        converter_via_pandas(saida, entrada, log)

    root = tk.Tk()
    root.title("Conversor XLSX → CSV (cClassTrib)")
    root.geometry("600x400")

    entrada_var = tk.StringVar()
    saida_var = tk.StringVar()

    tk.Label(root, text="Arquivo XLSX:").pack(anchor="w", padx=10, pady=(10, 0))
    tk.Entry(root, textvariable=entrada_var, width=80).pack(padx=10)
    tk.Button(root, text="Selecionar", command=selecionar_xlsx).pack(padx=10, pady=5)

    tk.Label(root, text="Salvar como CSV:").pack(anchor="w", padx=10, pady=(10, 0))
    tk.Entry(root, textvariable=saida_var, width=80).pack(padx=10)
    tk.Button(root, text="Selecionar", command=selecionar_csv).pack(padx=10, pady=5)

    tk.Button(root, text="Converter", command=executar, bg="#4CAF50", fg="white", height=2).pack(pady=10)

    txt_log = scrolledtext.ScrolledText(root, height=10)
    txt_log.pack(padx=10, pady=10, fill="both", expand=True)

    root.mainloop()

if __name__ == "__main__":
    iniciar_interface()

