#!/usr/bin/env python3

import os
import sys
import shutil
import sys

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from pypdf import PdfReader, PdfWriter

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
import json

with open("dados.json", "r") as f:
    dados = json.load(f)

# =========================
# CONFIGURAÇÃO
# =========================

PFX_PATH = "VITOR HUGO PINHEIRO BICCA_38027950082.pfx"
PFX_PASS = b"927*PFh66"

PDF_CONTRATO = "CONTRATO LOCAÇAO APTO JESSICA.pdf"
ASSINATURA_IMG = sys.argv[1]

PDF_FINAL = "CONTRATO_FINAL.pdf"
PDF_ASSINADO = "CONTRATO_FINAL_ASSINADO.pdf"


# =========================
# GERAR CARD
# =========================

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)

    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']}"
    ]

    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_ASSINADO)
    print("\nValide em: https://validar.iti.gov.br")


if __name__ == "__main__":
    main()