from boltons.typeutils import classproperty
from flask import current_app

from ereuse_devicehub.db import db
from ereuse_devicehub.resources.models import Thing


class Inventory(Thing):
    id = db.Column(db.Unicode(), primary_key=True)
    id.comment = """The name of the inventory as in the URL and schema."""
    name = db.Column(db.CIText(), nullable=False, unique=True)
    name.comment = """The human name of the inventory."""
    tag_provider = db.Column(db.URL(), nullable=False)
    tag_token = db.Column(db.UUID(as_uuid=True), unique=True, nullable=False)
    tag_token.comment = """The token to access a Tag service."""
    # todo no validation that UUID is from an existing organization
    org_id = db.Column(db.UUID(as_uuid=True), nullable=False)

    __table_args__ = (
        db.Index('id_hash', id, postgresql_using='hash'),
        {'schema': 'common'}
    )

    @classproperty
    def current(cls) -> 'Inventory':
        """The inventory of the current_app."""
        return Inventory.query.filter_by(id=current_app.id).one()