from string import digits, ascii_letters


class Registration:

    def __init__(self, login, password) -> None:
        self.login = login
        self.password = password

    @property
    def login(self):
        return self.__login
    
    @login.setter
    def login(self, value: str):
        if not isinstance(value, str):
            raise TypeError
        if '@' not in value:
            raise ValueError
        if value.rfind('.') < value.rfind('@'):
            raise ValueError
        self.__login = value

    @staticmethod
    def is_include_digit(value: str):
        for i in value:
            if i in digits:
                return True
        return False
    
    @staticmethod
    def is_include_all_register(value: str):
        upper = False
        lower = False
        for i in value:
            if not lower:
                lower = i.islower()
            if not upper:
                upper = i.isupper()
        return lower and upper

    @staticmethod
    def is_include_only_latin(value: str):
        for i in value:
            if not i.isdigit():
                if  i not in ascii_letters:
                    return False
        return True        

    @staticmethod
    def check_password_dictionary(value: str):
        with open('easy_passwords.txt', 'r', encoding='utf-8') as f:
            password_list = f.read().split('\n')
        return value in password_list
    
    @property
    def password(self):
        return self.__password
    
    @password.setter
    def password(self, value: str):
        if not isinstance(value, str):
            raise TypeError("Пароль должен быть строкой")
        if len(value) < 5 or len(value) > 11:
            raise ValueError("Пароль должен быть длиннее 4 и меньше 12 символов")
        if not self.is_include_digit(value):
            raise ValueError("Пароль должен содержать хотя бы одну цифру")
        if not self.is_include_all_register(value):
            raise ValueError("Пароль должен содержать хотя бы один символ верхнего и нижнего регистра")
        if not self.is_include_only_latin(value):
            raise ValueError("Пароль должен содержать только латинский алфавит")
        if self.check_password_dictionary(value):
            raise ValueError("Ваш пароль содержится в списке самых легких")
        self.__password = value


class File:

    def __init__(self, name) -> None:
        self.name = name
        self.in_trash = False
        self.is_deleted = False

    def restore_from_trash(self):
        print(f"Файл {self.name} восстановлен из корзины")
        self.in_trash = False

    def remove(self):
        print(f"Файл {self.name} был удален")
        self.is_deleted = True

    def read(self):
        if self.is_deleted == True:
            print(f"ErrorReadFileDeleted({self.name})")
            return
        if self.in_trash == True:
            print(f"ErrorReadFileTrashed({self.name})")
            return
        print(f"Прочитали все содержимое файла {self.name}")

    def write(self, content):
        if self.is_deleted:
            print(f"ErrorWriteFileDeleted({self.name})")
            return
        if self.in_trash:
            print(f"ErrorWriteFileTrashed({self.name})")
            return
        print(f"Записали значение {content} в файл {self.name}")


class Trash:

    content = []

    def __init__(self):
        pass

    @staticmethod
    def add(file: File):
        if not isinstance(file, File):
            print("В корзину можно добавлять только файл")
        else:
            file.in_trash = True
            Trash.content.append(file)

    @staticmethod
    def clear():
        print("Очищаем корзину")
        while Trash.content:
            Trash.content[0].remove()
            Trash.content.pop(0)
        print("Корзина пуста")

    @staticmethod
    def restore():
        print("Восстанавливаем файлы из корзины")
        while Trash.content:
            Trash.content[0].restore_from_trash()
            Trash.content.pop(0)
        print("Корзина пуста")






def main():

    f1 = File('puppies.jpg')
    f2 = File('cat.jpg')
    f3 = File('xxx.doc')
    passwords = File('pass.txt')

    for file in [f1, f2, f3, passwords]:
        assert file.is_deleted is False
        assert file.in_trash is False

    f3.read()
    f3.remove()
    assert f3.is_deleted is True
    f3.read()
    f3.write('hello')

    assert Trash.content == []

    Trash.add(f2)
    Trash.add(passwords)
    Trash.add(f3)

    f1.read()
    Trash.add(f1)
    f1.read()

    for file in [f1, f2, f3, passwords]:
        assert file.in_trash is True

    for f in [f2, passwords, f3, f1]:
        assert f in Trash.content

    Trash.restore()
    assert Trash.content == [], 'После восстановления корзина должна была очиститься'

    Trash.add(passwords)
    Trash.add(f2)
    Trash.add('hello')
    Trash.add(f1)

    for f in [passwords, f2, f1]:
        assert f in Trash.content


    Trash.clear()

    for file in [passwords, f2, f1]:
        assert file.is_deleted is True

    assert Trash.content == [], 'После удаления файлов корзина должна была очиститься'

    f1.read()

    '''
    f1 = File('puppies.jpg')
    assert f1.name == 'puppies.jpg'
    assert f1.in_trash is False
    assert f1.is_deleted is False

    f1.read()  # Прочитали все содержимое файла puppies.jpg
    f1.remove()  # Файл puppies.jpg был удален
    assert f1.is_deleted is True
    f1.read()  # ErrorReadFileDeleted(puppies.jpg)

    passwords = File('pass.txt')
    assert passwords.name == 'pass.txt'
    assert passwords.in_trash is False
    assert passwords.is_deleted is False

    f3 = File('xxx.doc')

    assert f3.__dict__ == {'name': 'xxx.doc', 'in_trash': False, 'is_deleted': False}
    f3.read()
    f3.remove()
    assert f3.is_deleted is True
    f3.read()
    f3.in_trash = True
    f3.is_deleted = False
    f3.read()
    f3.write('hello')
    f3.restore_from_trash()
    assert f3.in_trash is False
    f3.write('hello')  # Записали значение «hello» в файл cat.jpg

    f2 = File('cat.jpg')
    f2.write('hello')  # Записали значение «hello» в файл cat.jpg
    f2.write([1, 2, 3])  # Записали значение «hello» в файл cat.jpg
    f2.remove()  # Файл cat.jpg был удален
    f2.write('world')  # ErrorWriteFileDeleted(cat.jpg)
    '''
    

    '''
    try:
        s2 = Registration("fga", "asd12")
    except ValueError as e:
        pass
    else:
        raise ValueError("Registration('fga', 'asd12') как можно записать такой логин?")

    try:
        s2 = Registration("fg@a", "asd12")
    except ValueError as e:
        pass
    else:
        raise ValueError("Registration('fg@a', 'asd12') как можно записать такой логин?")

    s2 = Registration("translate@gmail.com", "as1SNdf")
    try:
        s2.login = "asdsa12asd."
    except ValueError as e:
        pass
    else:
        raise ValueError("asdsa12asd как можно записать такой логин?")

    try:
        s2.login = "asdsa12@asd"
    except ValueError as e:
        pass
    else:
        raise ValueError("asdsa12@asd как можно записать такой логин?")

    assert Registration.check_password_dictionary('QwerTy123'), 'проверка на пароль в слове не работает'

    try:
        s2.password = "QwerTy123"
    except ValueError as e:
        pass
    else:
        raise ValueError("QwerTy123 хранится в словаре паролей, как его можно было сохранить?")


    try:
        s2.password = "KissasSAd1f"
    except ValueError as e:
        pass
    else:
        raise ValueError("KissasSAd1f хранится в словаре паролей, как его можно было сохранить?")

    try:
        s2.password = "124244242"
    except ValueError as e:
        pass
    else:
        raise ValueError("124244242 пароль НЕОЧЕНЬ, как его можно было сохранить?")

    try:
        s2.password = "RYIWUhjkdbfjfgdsffds"
    except ValueError as e:
        pass
    else:
        raise ValueError("RYIWUhjkdbfjfgdsffds пароль НЕОЧЕНЬ, как его можно было сохранить?")

    try:
        s2.password = "CaT"
    except ValueError as e:
        pass
    else:
        raise ValueError("CaT пароль НЕОЧЕНЬ, как его можно было сохранить?")

    try:
        s2.password = "monkey"
    except ValueError as e:
        pass
    else:
        raise ValueError("monkey пароль НЕОЧЕНЬ, как его можно было сохранить?")

    try:
        s2.password = "QwerTy123"
    except ValueError as e:
        pass
    else:
        raise ValueError("QwerTy123 пароль есть в слове, нельзя его использовать")

    try:
        s2.password = "HelloQEWq"
    except ValueError as e:
        pass
    else:
        raise ValueError("HelloQEWq пароль НЕОЧЕНЬ, как его можно было сохранить?")

    try:
        s2.password = [4, 32]
    except TypeError as e:
        pass
    else:
        raise TypeError("Пароль должен быть строкой")

    try:
        s2.password = 123456
    except TypeError as e:
        pass
    else:
        raise TypeError("Пароль должен быть строкой")

    print('U r hacked Pentagon')
    '''


if __name__ == '__main__':
    main()