from SignatureBasique import SignatureBasique
from SignatureHorodatee import SignatureHorodatee
from SignatureLT import SignatureLT
from SignatureLTA import SignatureLTA
from Errors import *
from GlobalVariables import docs, docs_archived


class Document:
    def __init__(self, nom_fichier):
        fichier = open(nom_fichier, "r")
        self.__nom_fichier = nom_fichier
        fichier.close()
        self.__signature = "No signature"
        docs[nom_fichier] = self

    def sign_Basique(self, cle_privee, certificat):
        if self.__signature == "No signature":
            info = self.get_info()
            self.__signature = SignatureBasique(info, cle_privee, certificat)
        else:
            print("Erreur : Document comporte déjà une signature")
            raise SignError("Erreur : Document comporte déjà une signature")

    def sign_Horodatee(self, AH):
        if self.__signature.get_type() == "signature basique":
            new_signature = SignatureHorodatee(self.__signature, AH)
            self.__signature = new_signature
        else:
            print("Erreur : Document ne comporte pas la signature de classe précédente (signature basique)")
            raise SignError("Erreur : Document ne comporte pas la signature de classe précédente (signature basique)")

    def sign_LT(self, check = True):
        if self.__signature.get_type() == "signature horodatee":
            new_signature = SignatureLT(self.__signature, check)
            self.__signature = new_signature
        else:
            print("Erreur : Document ne comporte pas la signature de classe précédente (signature horodatée)")
            raise SignError("Erreur : Document ne comporte pas la signature de classe précédente (signature horodatée)")

    def sign_LTA(self, AH, check = True):
        if self.__signature.get_type() == "signature LT" or self.__signature.get_type() == "signature LTA":
            new_signature = SignatureLTA(self.__signature, AH, check)
            self.__signature = new_signature
        else:
            print("Erreur : Document ne comporte pas la signature de classe précédente (signature LT ou LTA) ")
            raise SignError("Erreur : Document ne comporte pas la signature de classe précédente (signature LT ou LTA)")

    def archive_doc(self, AH):
        if self.__signature == "No signature":
            raise ArchiveError("Ce système d'archivage n'accepte que des documents signés")
        elif self.__signature.get_type()== "signature basique":
            self.sign_Horodatee(AH)
            self.sign_LT(check=False)
            self.sign_LTA(AH,check=False)
        elif self.__signature.get_type()== "signature horodatee":
            self.sign_LT()
            self.sign_LTA(AH,check=False)
        elif self.__signature.get_type()== "signature LT":
            self.sign_LTA(AH)
        elif self.__signature.get_type()== "signature LTA":
            self.sign_LTA(AH)
        nom_fichier = self.__nom_fichier
        docs_archived[nom_fichier] = self
        del docs[nom_fichier]

    def get_info(self):
        fichier = open(self.__nom_fichier, "r")
        content = fichier.read()
        fichier.close()
        return content

    def get_signature(self):
        return self.__signature