"""Peewee ORM models — full schema for phases 1-5."""
from datetime import UTC, datetime


def _utcnow():
    return datetime.now(UTC).replace(tzinfo=None)

from peewee import (
    BooleanField,
    CharField,
    DateTimeField,
    ForeignKeyField,
    IntegerField,
    Model,
)

from imptune.db.database import db


class BaseModel(Model):
    """Base model that binds all models to the shared db instance."""

    class Meta:
        database = db


class Client(BaseModel):
    """Represents a deployment target (AD client / OU)."""

    name = CharField(unique=True)
    created_at = DateTimeField(default=_utcnow)

    class Meta:
        table_name = "client"


class Driver(BaseModel):
    """Uploaded printer driver package (content-addressed by SHA256)."""

    sha256 = CharField(unique=True, index=True)
    original_filename = CharField()
    size_bytes = IntegerField()
    uploaded_at = DateTimeField(default=_utcnow)
    driver_desc = CharField(null=True)
    inf_filename = CharField(null=True)
    architecture = CharField(null=True)
    has_cat_file = BooleanField(default=False)

    class Meta:
        table_name = "driver"


class Printer(BaseModel):
    """Printer configuration record."""

    name = CharField()
    ip_address = CharField()
    port_name = CharField()
    client = ForeignKeyField(Client, null=True, backref="printers")
    driver = ForeignKeyField(Driver, null=True, backref="printers")
    duplex_mode = CharField(default="OneSided")
    color_mode = BooleanField(default=True)
    paper_size = CharField(default="A4")
    collate = BooleanField(default=True)
    created_at = DateTimeField(default=_utcnow)
    updated_at = DateTimeField(default=_utcnow)

    class Meta:
        table_name = "printer"


class Icon(BaseModel):
    """Printer icon image (one per printer)."""

    printer = ForeignKeyField(Printer, unique=True, backref="icons")
    sha256 = CharField()
    original_filename = CharField()
    size_bytes = IntegerField()
    uploaded_at = DateTimeField(default=_utcnow)

    class Meta:
        table_name = "icon"
