from uuid import uuid4

from sqlalchemy import Column as sql_Column
from sqlalchemy import DateTime as sql_DateTime
from sqlalchemy import ForeignKey as sql_ForeignKey
from sqlalchemy import Integer as sql_Integer
from sqlalchemy import String as sql_String
from sqlalchemy import Uuid as sql_Uuid
from sqlalchemy.orm import relationship as sql_relationship
from sqlalchemy.sql.functions import now as sql_now

from .database import Base as db_Base


class Item(db_Base):
    __tablename__ = "items"

    uuid = sql_Column(sql_Uuid, primary_key=True, default=uuid4)
    amount = sql_Column(sql_Integer, default=1)
    received_amount = sql_Column(sql_Integer, nullable=True, default=None)
    created_at = sql_Column(sql_DateTime(timezone=True), server_default=sql_now())
    received_at = sql_Column(sql_DateTime(timezone=True), nullable=True, default=None)

    addressee = sql_Column(sql_String(64), nullable=True, default=None)
    team = sql_Column(sql_String(16), nullable=True, default=None)
    images = sql_relationship("Image", back_populates="item")

    deployed = sql_Column(sql_String(64), nullable=True, default=None)
    deployed_at = sql_Column(sql_DateTime(timezone=True), nullable=True, default=None)

    verification = sql_Column(sql_String(114), nullable=True, default=None)
    tag = sql_Column(sql_String(6), nullable=True, default=None)

    storage = sql_Column(
        sql_String(16), sql_ForeignKey("store.name"), nullable=True, default=None
    )
    stored_at = sql_relationship("Storage", back_populates="items")


class Storage(db_Base):
    __tablename__ = "store"

    name = sql_Column(sql_String(16), primary_key=True)
    items = sql_relationship("Item", back_populates="stored_at")


class Image(db_Base):
    __tablename__ = "images"

    uuid = sql_Column(sql_Uuid, primary_key=True, default=uuid4)
    item_uuid = sql_Column(sql_Uuid, sql_ForeignKey("items.uuid"))
    item = sql_relationship("Item", back_populates="images")