import tkinter as tk
from tkinter import messagebox, ttk
import pandas as pd
import os
from datetime import datetime
from fpdf import FPDF
import subprocess
import platform

arquivo1_csv = "controle_caixa.csv"
arquivo1_backup_csv = "backup_controle_caixa.csv"
nome_cmei = "CMEI Firmino Fernandes de Azevedo"

def limpar_campos():
    entrada_valor.delete(0, tk.END)
    entrada_descricao.delete(0, tk.END)

def salvar_em_arquivos(data, descricao, entrada, saida, saldo):
    def salvar_transacao_em_arquivo(arquivo):
        if not os.path.exists(arquivo):
            df = pd.DataFrame(columns=["Data", "Descrição", "Entrada", "Saída", "Saldo"])
            df.to_csv(arquivo, index=False)

        df = pd.read_csv(arquivo)
        nova_transacao = pd.DataFrame([[data, descricao, entrada, saida, saldo]], columns=["Data", "Descrição", "Entrada", "Saída", "Saldo"])
        df = pd.concat([df, nova_transacao], ignore_index=True)
        df.to_csv(arquivo, index=False)

    salvar_transacao_em_arquivo(arquivo1_csv)
    salvar_transacao_em_arquivo(arquivo1_backup_csv)

def adicionar_transacao(tipo_transacao):
    valor = entrada_valor.get()
    descricao = entrada_descricao.get().strip()

    if not valor or not descricao:
        messagebox.showerror("Erro", "Preencha todos os campos!")
        return

    try:
        valor = float(valor)
    except ValueError:
        messagebox.showerror("Erro", "O valor deve ser um número.")
        return

    data = datetime.now().strftime("%d/%m/%y")

    df = pd.read_csv(arquivo1_csv) if os.path.exists(arquivo1_csv) else pd.DataFrame(columns=["Data", "Descrição", "Entrada", "Saída", "Saldo"])
    saldo_anterior = df["Saldo"].iloc[-1] if not df.empty else 0

    entrada = valor if tipo_transacao == "Entrada" else 0
    saida = valor if tipo_transacao == "Saída" else 0
    novo_saldo = saldo_anterior + entrada - saida

    salvar_em_arquivos(data, descricao, entrada, saida, novo_saldo)

    messagebox.showinfo("Sucesso", f"Transação de {tipo_transacao} adicionada com sucesso!")
    limpar_campos()

def imprimir_relatorio():
    if os.path.exists(arquivo1_csv):
        df = pd.read_csv(arquivo1_csv)
        if not df.empty:
            pdf = FPDF()
            pdf.add_page()
            pdf.set_font("Arial", size=12)
            pdf.cell(200, 10, txt=nome_cmei, ln=True, align='C')
            pdf.cell(200, 10, txt="Relatório de Controle de Caixa", ln=True, align='C')
            pdf.ln(10)

            col_width = pdf.w / 5

            pdf.set_font("Arial", 'B', 10)
            pdf.cell(col_width, 10, "Data", border=1)
            pdf.cell(col_width, 10, "Descrição", border=1)
            pdf.cell(col_width, 10, "Entrada (R$)", border=1)
            pdf.cell(col_width, 10, "Saída (R$)", border=1)
            pdf.cell(col_width, 10, "Saldo (R$)", border=1)
            pdf.ln()

            pdf.set_font("Arial", size=10)
            for index, row in df.iterrows():
                pdf.cell(col_width, 10, row['Data'], border=1)
                pdf.set_font("Arial", size=6.5)
                pdf.cell(col_width, 10, row['Descrição'][:30], border=1)
                pdf.set_font("Arial", size=10)
                pdf.cell(col_width, 10, f"R$ {float(row['Entrada']):.2f}", border=1)
                pdf.cell(col_width, 10, f"R$ {float(row['Saída']):.2f}", border=1)
                pdf.cell(col_width, 10, f"R$ {float(row['Saldo']):.2f}", border=1)
                pdf.ln()

            subtotal_entrada = df["Entrada"].sum()
            subtotal_saida = df["Saída"].sum()
            saldo_final = df["Saldo"].iloc[-1]

            pdf.set_font("Arial", 'B', 10)
            pdf.cell(col_width, 10, "", border=1)
            pdf.cell(col_width, 10, "Subtotal", border=1)
            pdf.cell(col_width, 10, f"R$ {subtotal_entrada:.2f}", border=1)
            pdf.cell(col_width, 10, f"R$ {subtotal_saida:.2f}", border=1)
            pdf.cell(col_width, 10, f"R$ {saldo_final:.2f}", border=1)
            pdf.ln()

            nome_pdf = "relatorio_controle_caixa.pdf"
            pdf.output(nome_pdf)

            if platform.system() == "Linux":
                subprocess.run(['lp', nome_pdf])
            elif platform.system() == "Windows":
                os.startfile(nome_pdf, "print")
            else:
                messagebox.showinfo("Impressão", "Sistema operacional não suportado para impressão automática.")

            messagebox.showinfo("Impressão", f"Relatório gerado como {nome_pdf} e enviado para a impressora.")
        else:
            messagebox.showinfo("Impressão", "Nenhuma transação disponível para imprimir.")
    else:
        messagebox.showinfo("Impressão", "Arquivo de controle de caixa não encontrado.")

def visualizar_relatorio():
    if os.path.exists(arquivo1_csv):
        df = pd.read_csv(arquivo1_csv)
        if not df.empty:
            janela_relatorio = tk.Toplevel(root)
            janela_relatorio.title("Relatório de Controle de Caixa")

            tree = ttk.Treeview(janela_relatorio, columns=("Data", "Descrição", "Entrada", "Saída", "Saldo"), show='headings')
            tree.heading("Data", text="Data")
            tree.heading("Descrição", text="Descrição")
            tree.heading("Entrada", text="Entrada")
            tree.heading("Saída", text="Saída")
            tree.heading("Saldo", text="Saldo")

            for index, row in df.iterrows():
                tree.insert("", tk.END, values=(row["Data"], row["Descrição"], f"R$ {row['Entrada']:.2f}", f"R$ {row['Saída']:.2f}", f"R$ {row['Saldo']:.2f}"))

            tree.pack(expand=True, fill=tk.BOTH)
        else:
            messagebox.showerror("Erro", "Não há dados para visualizar.")
    else:
        messagebox.showerror("Erro", "Arquivo de controle de caixa não encontrado.")

def exportar_para_excel():
    if os.path.exists(arquivo1_csv):
        df = pd.read_csv(arquivo1_csv)
        if not df.empty:
            df['Entrada'] = df['Entrada'].apply(lambda x: f"R$ {float(x):.2f}" if pd.notnull(x) and str(x).replace('.', '', 1).isdigit() else "R$ 0.00")
            df['Saída'] = df['Saída'].apply(lambda x: f"R$ {float(x):.2f}" if pd.notnull(x) and str(x).replace('.', '', 1).isdigit() else "R$ 0.00")
            df['Saldo'] = df['Saldo'].apply(lambda x: f"R$ {float(x):.2f}" if pd.notnull(x) and str(x).replace('.', '', 1).isdigit() else "R$ 0.00")

            nome_arquivo_excel = f"controle_caixa_{datetime.now().strftime('%Y%m%d')}.xlsx"
            df.to_excel(nome_arquivo_excel, index=False)

            messagebox.showinfo("Sucesso", f"Dados exportados para {nome_arquivo_excel} com sucesso!")
        else:
            messagebox.showerror("Erro", "Não há dados para exportar.")
    else:
        messagebox.showerror("Erro", "Arquivo de controle de caixa não encontrado.")

def sair():
    root.quit()

root = tk.Tk()
root.title("Controle de Caixa - CMEI Firmino Fernandes de Azevedo")

label_valor = tk.Label(root, text="Valor:")
label_valor.grid(row=0, column=0, padx=10, pady=10)
entrada_valor = tk.Entry(root)
entrada_valor.grid(row=0, column=1, padx=10, pady=10)

label_descricao = tk.Label(root, text="Descrição:")
label_descricao.grid(row=1, column=0, padx=10, pady=10)
entrada_descricao = tk.Entry(root)
entrada_descricao.grid(row=1, column=1, padx=10, pady=10)

botao_entrada = tk.Button(root, text="Adicionar Entrada", command=lambda: adicionar_transacao("Entrada"))
botao_entrada.grid(row=2, column=0, padx=10, pady=10)

botao_saida = tk.Button(root, text="Adicionar Saída", command=lambda: adicionar_transacao("Saída"))
botao_saida.grid(row=2, column=1, padx=10, pady=10)

botao_imprimir = tk.Button(root, text="Imprimir Relatório", command=imprimir_relatorio)
botao_imprimir.grid(row=3, column=0, padx=10, pady=10)

botao_visualizar = tk.Button(root, text="Visualizar Relatório", command=visualizar_relatorio)
botao_visualizar.grid(row=3, column=1, padx=10, pady=10)

botao_exportar_excel = tk.Button(root, text="Exportar para Excel", command=exportar_para_excel)
botao_exportar_excel.grid(row=4, column=0, padx=10, pady=10)

botao_sair = tk.Button(root, text="Sair", command=sair)
botao_sair.grid(row=4, column=1, padx=10, pady=10)

root.mainloop()
