"""Model-to-supply mapping - data-driven toner/drum/waste part numbers.

Replaces the old hardcoded part-number table. Each row maps one printer
model to one supply part (a toner of a given color and capacity tier, or a
drum/waste/maintenance item). Lets new models and their toners be added
through the API/UI without a code change.
"""

from shopdb.api import db, BaseModel


# allowed values, surfaced to the UI via the /supplies/meta endpoint
SUPPLY_TYPES = ('toner', 'drum', 'waste', 'maintenance')
SUPPLY_COLORS = ('black', 'cyan', 'magenta', 'yellow', 'none')
CAPACITY_TIERS = ('standard', 'high', 'extrahigh', 'metered', 'dmo')


class ModelSupply(BaseModel):
    """One supply part belonging to one printer model."""
    __tablename__ = 'modelsupplies'

    modelsupplyid = db.Column(db.Integer, primary_key=True)

    modelnumberid = db.Column(
        db.Integer,
        db.ForeignKey('models.modelnumberid'),
        nullable=False,
    )

    # toner, drum, waste, maintenance
    supplytype = db.Column(db.String(20), nullable=False, default='toner')
    # black, cyan, magenta, yellow, or none (drum/waste have no color)
    color = db.Column(db.String(20), nullable=False, default='none')
    # standard, high, extrahigh, metered, dmo
    capacitytier = db.Column(db.String(20), nullable=False, default='standard')

    partnumber = db.Column(db.String(50), nullable=False)
    marketingname = db.Column(db.String(120))
    pageyield = db.Column(db.Integer, comment='Rated page yield at 5 percent coverage')
    notes = db.Column(db.Text)

    model = db.relationship('Model', backref='supplies')

    # one part number per model, no duplicates
    __table_args__ = (
        db.UniqueConstraint('modelnumberid', 'partnumber', name='uq_modelsupply_part'),
    )

    def __repr__(self):
        return f"<ModelSupply {self.partnumber} ({self.color}/{self.capacitytier})>"

    def to_dict(self):
        data = super().to_dict()
        if self.model:
            data['modelnumber'] = self.model.modelnumber
        return data
