#!/usr/bin/env python3

def cifra_cesar(texto, chave):
    resultado = ""
    for c in texto:
        if 'A' <= c <= 'Z':
            resultado += chr((ord(c) - ord('A') + chave) % 26 + ord('A'))
        elif 'a' <= c <= 'z':
            resultado += chr((ord(c) - ord('a') + chave) % 26 + ord('a'))
        else:
            resultado += c
    return resultado


def processar_arquivo(entrada, saida, chave):
    try:
        with open(entrada, "r", encoding="utf-8") as f:
            texto = f.read()

        texto = cifra_cesar(texto, chave)

        with open(saida, "w", encoding="utf-8") as f:
            f.write(texto)

        return True

    except FileNotFoundError:
        print(f"\n[ERRO] Arquivo não encontrado: {entrada}")
    except UnicodeDecodeError:
        print("\n[ERRO] O arquivo não é um texto UTF-8.")
    except OSError as erro:
        print(f"\n[ERRO] {erro}")

    return False


def main():
    while True:
        print("\n╔══════════════════════════════════════╗")
        print("║          CIFRA DE CÉSAR              ║")
        print("╠══════════════════════════════════════╣")
        print("║ 1 - Codificar arquivo                ║")
        print("║ 2 - Descodificar arquivo             ║")
        print("║ 3 - Codificar texto                  ║")
        print("║ 4 - Descodificar texto               ║")
        print("║ 5 - Sair                             ║")
        print("╚══════════════════════════════════════╝")

        opcao = input("\n>>> ")

        if opcao == "5":
            print("\nSaindo...")
            break

        if opcao not in ("1", "2", "3", "4"):
            print("\n[ERRO] Opção inválida.")
            continue

        try:
            chave = int(input("CHAVE  : "))
        except ValueError:
            print("\n[ERRO] A chave deve ser um número inteiro.")
            continue

        deslocamento = chave if opcao in ("1", "3") else -chave

        if opcao in ("1", "2"):
            entrada = input("INPUT  : ")
            saida = input("OUTPUT : ")

            if processar_arquivo(entrada, saida, deslocamento):
                print("\n[✓] Arquivo processado com sucesso!")
                print(f"[✓] INPUT  : {entrada}")
                print(f"[✓] OUTPUT : {saida}")

        else:
            texto = input("\nINPUT  : ")
            resultado = cifra_cesar(texto, deslocamento)
            print(f"OUTPUT : {resultado}")


if __name__ == "__main__":
    main()
