from datetime import datetime

import pytz

from .utils import get_datetime_from_unix, undo_snake_case_key


class BaseWeather:
    summary: str
    icon: str
    data_class: object

    def __init__(self, summary=None, icon=None, data=None, timezone=None):
        self.summary = summary
        self.icon = icon

        assert self.data_class is not None
        self.data = [self.data_class(timezone=timezone, **item)
                     for item in (data or [])]

    def __repr__(self):
        return '%s([%d])' % (self.__class__.__name__, len(self.data))

    def __iter__(self):
        return iter(self.data)


class AutoInit:

    def __init__(self, **params):
        try:
            timezone = pytz.timezone(params.pop('timezone', None))
        except (pytz.UnknownTimeZoneError, AttributeError):
            timezone = pytz.UTC

        for field in self.__annotations__:
            api_field = undo_snake_case_key(field)
            if self.__annotations__[field] == datetime:
                params[api_field] = get_datetime_from_unix(
                    params.get(api_field),
                    timezone
                )

            if api_field in params:
                setattr(self, field, params.get(api_field))
            else:
                setattr(self, field, None)

    def __iter__(self):
        return iter(self.__dict__.items())

    def __repr__(self):
        return '%s(%s)' % (self.__class__.__name__, getattr(self, 'time', ''))