
class BankAccount:

    def __init__(self, name, balance, passport) -> None:
        self._name = name
        self._balance = balance
        self._passport = passport

        self.__name = name
        self.__balance = balance
        self.__passport = passport


    def print_protected_data(self):
        print(self._name, self._balance, self._passport)

    # Инкапсуляция - сокрытие данных
    def print_private_data(self):
        print(self.__name, self.__balance, self.__passport)

    def __private_method(self):
        pass

class Student:
    def __init__(self, name, age, branch) -> None:
        self.__name = name
        self.__age = age
        self.__branch = branch

    def __display_details(self):
        print(f'Имя: {self.__name}\n Возраст: {self.__age}\n Направление: {self.__branch}')

    def access_private_method(self):
        self.__display_details()


class BankDeposit:
    def __init__(self, name, balance, rate):
        self.name = name
        self.balance = balance
        self.rate = rate

    def __calculate_profit(self):
        return self.balance/100*self.rate
    
    def get_balance_with_profit(self):
        return self.balance + self.__calculate_profit()
        

class Library:
    def __init__(self, books: list) -> None:
        self.__books = books

    def __check_availability(self, book_name):
        return True if book_name in self.__books else False

    def search_book(self, book_name):
        return self.__check_availability(book_name)
    
    def return_book(self, book_name):
        self.__books.append(book_name)

    def _checkout_book(self, book_name):
        if self.__check_availability(book_name):
            self.__books.remove(book_name)
            return True
        else:
            return False
        

class Employee:
    def __init__(self, name, position, hours_worked, hourly_rate):
        self.name = name
        self.__position = position
        self.__hours_worked = hours_worked
        self.__hourly_rate = hourly_rate

    def __calculate_salary(self):
        return self.__hours_worked*self.__hourly_rate
    
    def _set_position(self, position):
        self.__position = position

    def get_position(self):
        return self.__position
    
    def get_salary(self):
        return self.__calculate_salary()
    
    def get_employee_details(self):
        return f"Name: {self.name}, Position: {self.__position}, Salary: {self.__calculate_salary()}"

def main():
    '''
    account1 = BankAccount('Bob', 1000, 2312312312)
    account1.print_protected_data()
    account1.print_private_data()
    print(dir(account1))

    # Доступ к приватным атрибутам и методам
    account1._BankAccount__name = 'sdfsasd'
    print(account1._BankAccount__name)
    '''
    '''
    account = BankDeposit("John Connor", 1000, 5)
    assert account.name == "John Connor"
    assert account.balance == 1000
    assert account.rate == 5
    assert account._BankDeposit__calculate_profit() == 50.0
    assert account.get_balance_with_profit() == 1050.0

    account_2 = BankDeposit("Sarah Connor", 200, 27)
    assert account_2.name == "Sarah Connor"
    assert account_2.balance == 200
    assert account_2.rate == 27
    assert account_2._BankDeposit__calculate_profit() == 54.0
    assert account_2.get_balance_with_profit() == 254.0
    print('Good')
    '''

    '''
    library = Library(["War and Peace", "Moby-Dick", "Pride and Prejudice"])

    assert library._Library__books == ["War and Peace", "Moby-Dick", "Pride and Prejudice"]
    assert library.search_book("Moby-Dick") == True
    assert library.search_book("Jane Air") == False

    assert library._Library__check_availability("War and Peace") == True
    assert library._checkout_book("Moby-Dick") == True
    assert library._Library__books == ["War and Peace", "Pride and Prejudice"]

    assert library.search_book("Moby-Dick") == False
    assert library.return_book("Moby-Dick") is None
    assert library._Library__books == ["War and Peace", "Pride and Prejudice", "Moby-Dick"]
    assert library.search_book("Moby-Dick") == True
    print('Good')
    '''
    employee = Employee("Джеки Чан", 'manager', 20, 40)
    assert employee.name == 'Джеки Чан'
    assert employee._Employee__hours_worked == 20
    assert employee._Employee__hourly_rate == 40
    assert employee._Employee__position == 'manager'
    assert employee.get_position() == 'manager'
    assert employee.get_salary() == 800
    assert employee._Employee__calculate_salary() == 800
    assert employee.get_employee_details() == 'Name: Джеки Чан, Position: manager, Salary: 800'
    employee._set_position('Director')
    assert employee.get_employee_details() == 'Name: Джеки Чан, Position: Director, Salary: 800'

    employee_2 = Employee("Пирс Броснан", 'actor', 35, 30)
    assert employee_2._Employee__calculate_salary() == 1050
    assert employee_2.get_employee_details() == 'Name: Пирс Броснан, Position: actor, Salary: 1050'

print('Good')


if __name__ == '__main__':
    main()