import json

from django.contrib.gis import geos
from django.contrib.gis.db import models
from spillway.models import AbstractRasterStore
from spillway.query import GeoQuerySet, RasterQuerySet

_geom = {
    'type': 'Polygon',
    'coordinates': [[
        [ -64.95, -31.42 ],
        [ -61.69, -28.22 ],
        [ -61.61, -32.39 ],
        [ -64.95, -31.42 ]
    ]]
}


class AbstractLocation(models.Model):
    name = models.CharField(max_length=30)
    geom = models.GeometryField()

    class Meta:
        abstract = True
        ordering = ['id']

    def __repr__(self):
        return '<%s: %s %s>' % (self.__class__.__name__, self.name, self.geom)

    def __str__(self):
        return self.name

    @classmethod
    def create(cls, **data):
        geom = data.pop('geom', _geom)
        if isinstance(geom, dict):
            geom = json.dumps(geom)
        defaults = {'name': 'Vancouver', 'geom': geom}
        defaults.update(**data)
        obj = cls(**defaults)
        obj.save()
        return obj

    @classmethod
    def add_buffer(cls, coord, radius, **data):
        return cls.create(geom=geos.Point(*coord).buffer(radius), **data)


class Location(AbstractLocation):
    """Test location."""
    objects = GeoQuerySet.as_manager()


class GeoLocation(AbstractLocation):
    """Test geo location."""


class RasterStore(AbstractRasterStore):
    objects = RasterQuerySet.as_manager()