import pytest
from modules.utils import gerar_assinatura_SHA256_ficheiro
import hashlib


def test_gerar_assinatura_SHA256_ficheiro(tmp_path):
    # criar ficheiro temporario
    ficheiro = tmp_path / "teste.txt"
    conteudo = "Conteudo de teste"
    ficheiro.write_text(conteudo)
    # gerar assinatura usando a função 'gerar_assinatura_SHA256_ficheiro()'
    assinatura_funcao = gerar_assinatura_SHA256_ficheiro(str(ficheiro))
    # gerar assinatura manualmente para comparar
    with open(ficheiro, "rb") as f:
        assinatura_manual = hashlib.sha256(f.read()).hexdigest()
    # verificar se ambas as assinaturas coincidem
    assert assinatura_funcao == assinatura_manual


def test_gerar_assinatura_SHA256_ficheiro_inexistente():
    # testar comportamento se ficheiro não existir
    with pytest.raises(FileNotFoundError):
        gerar_assinatura_SHA256_ficheiro("ficheiro_que_nao_existe.txt")


def test_gerar_assinatura_SHA256_ficheiro_grande(tmp_path):
    ficheiro_grande = tmp_path / "grande.txt"
    conteudo = "ABCDE" * 10**5  # muito conteudo
    ficheiro_grande.write_text(conteudo)

    assinatura_funcao = gerar_assinatura_SHA256_ficheiro(str(ficheiro_grande))

    with open(ficheiro_grande, "rb") as f:
        assinatura_manual = hashlib.sha256(f.read()).hexdigest()

    assert assinatura_funcao == assinatura_manual


def test_gerar_assinatura_SHA256_ficheiro_binario(tmp_path):
    ficheiro_binario = tmp_path / "ficheiro.bin"
    conteudo_binario = bytes(range(256))  # cria bytes de 0 a 255
    ficheiro_binario.write_bytes(conteudo_binario)

    assinatura_funcao = gerar_assinatura_SHA256_ficheiro(str(ficheiro_binario))

    with open(ficheiro_binario, "rb") as f:
        assinatura_manual = hashlib.sha256(f.read()).hexdigest()

    assert assinatura_funcao == assinatura_manual


def test_gerar_assinatura_SHA256_ficheiros_iguais(tmp_path):
    ficheiro1 = tmp_path / "ficheiro1.txt"
    ficheiro2 = tmp_path / "ficheiro2.txt"
    conteudo = "Conteudo igual nos dois ficheiros"

    ficheiro1.write_text(conteudo)
    ficheiro2.write_text(conteudo)

    assinatura1 = gerar_assinatura_SHA256_ficheiro(str(ficheiro1))
    assinatura2 = gerar_assinatura_SHA256_ficheiro(str(ficheiro2))

    assert assinatura1 == assinatura2
