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

import re
import uuid

from dateutil import parser
from cerberus import Validator as BaseValidator

import utils


class Validator(BaseValidator):
    def __validate_datetime_string(self, value):
        try:
            parser.parse(value)
            return True
        except ValueError:
            pass

    def _validate_type_required_datetime_string(self, value):
        return self.__validate_datetime_string(value)

    def _validate_type_optional_datetime_string(self, value):
        if value is not None:
            return self.__validate_datetime_string(value)
        return True

    def _validate_type_url_safe_string(self, value):
        if isinstance(value, basestring) and re.match(r'^[a-zA-Z0-9_\-/]*$', value):
            return True

    def _validate_type_uuid(self, value):
        try:
            uuid.UUID(value)
            return True
        except ValueError:
            pass


def coerce_string_to_utc_string(value):
    if value is not None:
        try:
            return utils.string_to_utc_string(value)
        except Exception:
            # dateutil.parser is going to throw an error when try to parse the value
            pass

    return value


def coerce_empty_to_none(value):
    return None if not value or value == "None" else value


def coerce_empty_to_zero(value):
    return 0 if not value else int(value)
