from typing import Any, List, Dict, Callable
from szurubooru import model, rest, errors


def get_serialization_options(ctx: rest.Context) -> List[str]:
    return ctx.get_param_as_list('fields', default=[])


class BaseSerializer:
    _fields = {}  # type: Dict[str, Callable[[model.Base], Any]]

    def serialize(self, options: List[str]) -> Any:
        field_factories = self._serializers()
        if not options:
            options = list(field_factories.keys())
        ret = {}
        for key in options:
            if key not in field_factories:
                raise errors.ValidationError(
                    'Invalid key: %r. Valid keys: %r.' % (
                        key, list(sorted(field_factories.keys()))))
            factory = field_factories[key]
            ret[key] = factory()
        return ret

    def _serializers(self) -> Dict[str, Callable[[], Any]]:
        raise NotImplementedError()