# Property. getter, setter.
'''
class BandAccount:
    def __init__(self, name, balance) -> None:
        self.name = name
        self.__balance = balance
        
    def get_balance(self):
        return self.__balance
    
    def set_balance(self, value):
        if not isinstance(value, (int, float)):
            raise ValueError("Баланс должен быть числом")
        self.__balance = value
'''

'''
class BankAccount:
    def __init__(self, name, balance) -> None:
        self.name = name
        self.__balance = balance
        
    def get_balance(self):
        return self.__balance
    
    def set_balance(self, value):
        if not isinstance(value, (int, float)):
            raise ValueError("Баланс должен быть числом")
        self.__balance = value

    def delete_balance(self):
        del self.__balance

    balance = property(fget=get_balance, fset=set_balance, fdel=delete_balance)
'''

class BankAccount:
    def __init__(self, name, balance) -> None:
        self.name = name
        self.__balance = balance
        
    def get_balance(self):
        return self.__balance
    
    def set_balance(self, value):
        if not isinstance(value, (int, float)):
            raise ValueError("Баланс должен быть числом")
        self.__balance = value

    def delete_balance(self):
        del self.__balance

    balance = property(fget=get_balance, fset=set_balance, fdel=delete_balance)
    

class BankAccount:
    def __init__(self, account_number, balance) -> None:
        self._account_number = account_number
        self._balance = balance

    def get_account_number(self):
        return self._account_number
    
    def get_balance(self):
        return self._balance
    
    def set_balance(self, value):
        if not isinstance(value, (int, float)):
            raise ValueError("ErrorValue!!!")
        self._balance = value

        
class Employee:
    def __init__(self, name, salary) -> None:
        self.__name = name
        self.__salary = salary

    def __get_name(self):
        return self.__name

    def __get_salary(self):
        return self.__salary
    
    def __set_salary(self, value):
        if not isinstance(value, (int, float)) or (value < 0):
            print(f"ErrorValue:{value}")
            return
        self.__salary = value

    title = property(fget=__get_name)

    reward = property(fget=__get_salary, fset=__set_salary)


class UserMail:
    def __init__(self, login, email: str):
        self.login = login
        self.__email = email

    def get_email(self):
        return self.__email
    
    def set_email(self, email):
        if not isinstance(email, str):
            print(f"ErrorMail:{email}")
            return
        if email.count('@') == 1 and (email.rfind('@') < email.rfind('.')):
            self.__email = email
        else:
            print(f"ErrorMail:{email}")
            return

    email = property(fget=get_email, fset=set_email)




def main():
    '''
    acc = BandAccount('Ivan', 200)
    acc.balance = 400
    print(acc.balance)
    '''

    '''
    employee = Employee("John Doe", 50000)
    assert employee.title == "John Doe"
    assert employee._Employee__name == "John Doe"
    assert isinstance(employee, Employee)
    assert isinstance(type(employee).title, property), 'Вы не создали property title'
    assert isinstance(type(employee).reward, property), 'Вы не создали property reward'

    assert employee.reward == 50000
    employee.reward = -100  # ErrorValue:-100

    employee.reward = 1.5
    assert employee.reward == 1.5

    employee.reward = 70000
    assert employee.reward == 70000
    employee.reward = 'hello'  # Печатает ErrorValue:hello
    employee.reward = '777'  # Печатает ErrorValue:777
    employee.reward = [1, 2]  # Печатает ErrorValue:[1, 2]
    assert employee.reward == 70000
    employee._Employee__set_salary(55000)
    assert employee._Employee__get_salary() == 55000
    '''

    jim = UserMail("aka47", 'hello@com.org')
    assert jim.login == "aka47"
    assert jim._UserMail__email == "hello@com.org"
    assert isinstance(jim, UserMail)
    assert isinstance(type(jim).email, property), 'Вы не создали property email'

    jim.email = [1, 2, 3]  # печатает ErrorMail:[1, 2, 3]
    jim.email = 'hello@@re.ee'  # печатает ErrorMail:hello@@re.ee
    jim.email = 'hello@re.w3'
    assert jim.email == 'hello@re.w3'

    k = UserMail('belosnezhka', 'prince@wait.you')
    assert k.email == 'prince@wait.you'
    assert k.login == 'belosnezhka'
    assert isinstance(k, UserMail)

    k.email = {1, 2, 3}  # печатает ErrorMail:{1, 2, 3}
    k.email = 'prince@still@.wait'  # печатает ErrorMail:prince@still@.wait
    k.email = 'prince@stillwait'  # печатает ErrorMail:prince@stillwait
    k.email = 'prince@still.wait'
    assert k.get_email() == 'prince@still.wait'
    k.email = 'pri.nce@stillwait'  # печатает ErrorMail:pri.nce@stillwait
    assert k.email == 'prince@still.wait'


if __name__ == '__main__':
    main()