#classmethod staticmethod

import json

class Example:
    def hello():
        print('hello')

    '''Не привязывается ни к экземпляру ни к классу.
    Не имеет доступа к self и не может его изменить.'''
    @staticmethod
    def static_hello():
        print('static hello')

    '''Принимае объект самого класса.
    Может создавать новые экземпляры класса.'''
    @classmethod
    def class_hello(cls):
        print(f'class hello {cls}')


class TemperatureConverter:

    @staticmethod
    def celsius_to_fahrenheit(val):
        return val*9/5 + 32

    @staticmethod
    def fahrenheit_to_celsius(val):
        return (val - 32)*5/9

    @staticmethod
    def celsius_to_kelvin(val):
        return val + 273.15

    @staticmethod
    def kelvin_to_celsius(val):
        return val - 273.15

    @staticmethod
    def fahrenheit_to_kelvin(val):
        return round(((val - 32)*5/9 + 273.15), 2)

    @staticmethod
    def kelvin_to_fahrenheit(val):
        return round(((val - 273.15)*9/5 + 32), 2)

    @staticmethod
    def format(val, sim: str):
        return f"{val}°{sim}"


class Circle:

    def __init__(self, radius):
        if not Circle.is_positive(radius):
            raise ValueError("Радиус должен быть положительным")
        self.radius = radius

    @classmethod
    def from_diameter(cls, value):
        return cls(value/2.0)

    @staticmethod
    def is_positive(value):
        return True if value >= 0 else False

    @staticmethod
    def area(radius):
        return 3.14*radius**2


class AppConfig:

    __config = {}

    def __init__(self):
        pass

    @classmethod
    def load_config(cls, file_name: str):
        with open(file_name, "r") as f:
            cls.__config = json.load(f)
            
    @classmethod
    def get_config(cls, key : str):

        if '.' in key:
            external_key, internal_key = key.split('.')
            if external_key in cls.__config.keys() and internal_key in cls.__config[external_key].keys():
                return cls.__config[external_key][internal_key]
            else:
                return None
        else:
            if key in cls.__config.keys():
                return cls.__config[key]
            else:
                return None


def main():

    AppConfig.load_config('app_config.json')

    # Получение значения конфигурации
    assert AppConfig.get_config('database') == {
        'host': '127.0.0.1', 'port': 5432,
        'database_name': 'postgres_db',
        'user': 'owner',
        'password': 'ya_vorona_ya_vorona'}
    assert AppConfig.get_config('database.user') == 'owner'
    assert AppConfig.get_config('database.password') == 'ya_vorona_ya_vorona'
    assert AppConfig.get_config('database.pass') is None
    assert AppConfig.get_config('password.database') is None

    config = AppConfig()
    assert config.get_config('max_connections') == 10
    assert config.get_config('min_connections') is None

    conf = AppConfig()
    assert conf.get_config('max_connections') == 10
    assert conf.get_config('database.user') == 'owner'
    assert conf.get_config('database.host') == '127.0.0.1'
    assert conf.get_config('host') is None

    print('Good')

if __name__ == '__main__':
    main()