#!/usr/bin/env python3

import os
import sys
import shutil

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from pypdf import PdfReader, PdfWriter

PAGE_WIDTH, PAGE_HEIGHT = A4

from pyhanko.sign import signers
from pyhanko.sign.fields import SigFieldSpec
from pyhanko.sign.signers import PdfSigner
from pyhanko.sign.signers.pdf_signer import PdfSignatureMetadata
from pyhanko_certvalidator import ValidationContext

from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter

# =========================
# CONFIGURAÇÃO
# =========================

PDF_CONTRATO = "CONTRATO LOCAÇAO APTO JESSICA.pdf"
ASSINATURA_IMG = "assinatura.png"

PDF_FINAL = "CONTRATO_FINAL.pdf"
PDF_ASSINADO = "CONTRATO_FINAL_ASSINADO.pdf"

import hashlib

def gerar_hash_pdf(pdf_path):

    sha256 = hashlib.sha256()

    with open(pdf_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            sha256.update(chunk)

    return sha256.hexdigest()

def gerar_card(temp_pdf, dados):

    c = canvas.Canvas(temp_pdf, pagesize=A4)

    y = PAGE_HEIGHT - 40
    altura_card = 100

    c.rect(20, y - altura_card, PAGE_WIDTH - 40, altura_card)

    c.setFont("Helvetica-Bold", 11)
    c.drawString(30, y - 20, dados["nome"])

    c.setFont("Helvetica", 9)

    hash_doc = gerar_hash_pdf(PDF_CONTRATO)

    linhas = [
        f"IP: {dados['ip']}",
        f"Dispositivo: {dados['device']}",
        f"Data e hora: {dados['data']}",
        f"E-mail: {dados['email']}",
        f"Telefone: {dados['telefone']}",
        f"Token: {dados['token']}",
        f"Hash SHA256:",
        hash_doc[:64]
    ]

    yy = y - 35

    for linha in linhas:
        c.drawString(30, yy, linha)
        yy -= 12

    c.drawImage(
        ASSINATURA_IMG,
        PAGE_WIDTH - 180,
        y - 85,
        width=170,
        height=70,
        preserveAspectRatio=True
    )

    c.save()


# =========================
# MESCLAR PDF
# =========================

def gerar_pdf_final():

    temp_pdf = "card_temp.pdf"

    dados = {
        "nome": "VITOR HUGO PINHEIRO BICCA",
        "ip": "111.111.111.111",
        "device": "Android",
        "data": "12/03/2026",
        "email": "vitor.bicca@gmail.com",
        "telefone": "5547996623966",
        "token": "****"
    }

    gerar_card(temp_pdf, dados)

    reader_original = PdfReader(PDF_CONTRATO)
    reader_card = PdfReader(temp_pdf)

    writer = PdfWriter()

    for page in reader_original.pages:
        writer.add_page(page)

    for page in reader_card.pages:
        writer.add_page(page)

    with open(PDF_FINAL, "wb") as f:
        writer.write(f)

    os.remove(temp_pdf)


# =========================
# ASSINAR PDF (PAdES)
# =========================

"""def assinar_pdf():

    signer = signers.SimpleSigner.load_pkcs12(
        PFX_PATH,
        passphrase=PFX_PASS
    )

    with open(PDF_FINAL, "rb") as inf:
        writer = IncrementalPdfFileWriter(inf)

        with open(PDF_ASSINADO, "wb") as outf:

            PdfSigner(
                signature_meta=PdfSignatureMetadata(
                    field_name="Signature1"
                ),
                signer=signer
            ).sign_pdf(writer, output=outf)

PAGE_WIDTH, PAGE_HEIGHT = A4"""


# =========================
# MAIN
# =========================

def main():

    print("Gerando PDF...")
    gerar_pdf_final()

    #print("Assinando PDF (PAdES)...")
    #assinar_pdf()

    print("\nArquivo final:")
    print(PDF_FINAL)
    print("\nValide em: https://validar.iti.gov.br")


if __name__ == "__main__":
    main()