#!/usr/bin/env python
# coding: utf-8
"""
Models and database definition
"""
import json
import os

import bottle
import peewee
from playhouse.db_url import connect
from playhouse.shortcuts import model_to_dict

from server.tools import UTC_now

db = connect(os.environ.get('DATABASE', 'sqlite:///reports.db'))


@bottle.hook('before_request')
def _connect_db():
    db.connect()


@bottle.hook('after_request')
def _close_db():
    if not db.is_closed():
        db.close()


class BaseModel(peewee.Model):
    """
    Common base class for all models
    """
    class Meta:
        database = db


class Report(BaseModel):
    """
    A report object
    """
    type = peewee.CharField(max_length=255)
    lat = peewee.DoubleField()
    lng = peewee.DoubleField()
    first_report_datetime = peewee.DateTimeField(
        default=UTC_now
    )
    datetime = peewee.DateTimeField(
        default=UTC_now
    )
    expiration_datetime = peewee.DateTimeField(null=True)
    upvotes = peewee.IntegerField(default=0)
    downvotes = peewee.IntegerField(default=0)
    source = peewee.CharField(max_length=255, default='')
    shape_geojson = peewee.TextField(default=None, null=True)

    def to_json(self):
        return {
            "type": "reports",
            "id": self.id,
            "attributes": {
                k: v for k, v in model_to_dict(self).items()
                if k != "id"
            }
        }

    def to_geojson_feature(self):
        properties = {
            "type": "reports",
        }
        for k, v in model_to_dict(self).items():
            properties[k] = v

        geometry = None
        if self.shape_geojson:
            geometry = json.loads(self.shape_geojson)
        else:
            geometry = {
                "type": "Point",
                "coordinates": [self.lng, self.lat]
            }
        return {
            "type": "Feature",
            "properties": properties,
            "geometry": geometry,
        }
