# -*- coding: utf-8 -*-

from benedict.serializers.abstract import AbstractSerializer
from benedict.serializers.base64 import Base64Serializer
from benedict.serializers.csv import CSVSerializer
from benedict.serializers.ini import INISerializer
from benedict.serializers.json import JSONSerializer
from benedict.serializers.pickle import PickleSerializer
from benedict.serializers.plist import PListSerializer
from benedict.serializers.query_string import QueryStringSerializer
from benedict.serializers.toml import TOMLSerializer
from benedict.serializers.xml import XMLSerializer
from benedict.serializers.yaml import YAMLSerializer

import re


_BASE64_SERIALIZER = Base64Serializer()
_CSV_SERIALIZER = CSVSerializer()
_INI_SERIALIZER = INISerializer()
_JSON_SERIALIZER = JSONSerializer()
_PICKLE_SERIALIZER = PickleSerializer()
_PLIST_SERIALIZER = PListSerializer()
_QUERY_STRING_SERIALIZER = QueryStringSerializer()
_TOML_SERIALIZER = TOMLSerializer()
_YAML_SERIALIZER = YAMLSerializer()
_XML_SERIALIZER = XMLSerializer()

_SERIALIZERS = {
    'b64': _BASE64_SERIALIZER,
    'base64': _BASE64_SERIALIZER,
    'csv': _CSV_SERIALIZER,
    'ini': _INI_SERIALIZER,
    'json': _JSON_SERIALIZER,
    'pickle': _PICKLE_SERIALIZER,
    'plist': _PLIST_SERIALIZER,
    'qs': _QUERY_STRING_SERIALIZER,
    'querystring': _QUERY_STRING_SERIALIZER,
    'toml': _TOML_SERIALIZER,
    'yaml': _YAML_SERIALIZER,
    'yml': _YAML_SERIALIZER,
    'xml': _XML_SERIALIZER,
}

_SERIALIZERS_EXTENSIONS = ['.{}'.format(extension) for extension in _SERIALIZERS.keys()]


def get_format_by_path(path):
    path = path.lower()
    for extension in _SERIALIZERS_EXTENSIONS:
        if path.endswith(extension):
            return extension[1:]
    return None


def get_serializer_by_format(format):
    format_key = (format or '').lower().strip()
    format_key = re.sub(r'[\s\-\_]*', '', format_key)
    return _SERIALIZERS.get(format_key)


def get_serializers_extensions():
    return list(_SERIALIZERS_EXTENSIONS)