from .._compat import integer_types
from ..adapters.couchdb import CouchDB
from ..helpers.classes import Reference
from ..helpers.serializers import serializers
from ..objects import Row
from . import for_type, representers
from .base import NoSQLRepresenter

long = integer_types[-1]


@representers.register_for(CouchDB)
class CouchDBRepresenter(NoSQLRepresenter):
    def adapt(self, value):
        return repr(
            not isinstance(value, unicode) and value or value and value.encode("utf8")
        )

    @for_type("id")
    def _id(self, value):
        return str(long(value))

    @for_type("reference", adapt=False)
    def _reference(self, value):
        if isinstance(value, (Row, Reference)):
            value = value["id"]
        return self.adapter.object_id(value)

    @for_type("date", adapt=False)
    def _date(self, value):
        return serializers.json(value)

    @for_type("time", adapt=False)
    def _time(self, value):
        serializers.json(value)

    @for_type("datetime", adapt=False)
    def _datetime(self, value):
        return serializers.json(value)

    @for_type("boolean", adapt=False)
    def _boolean(self, value):
        return serializers.json(value)
