from sqlalchemy import Column, Integer, String, Float, DateTime, Index, UniqueConstraint
from sqlalchemy.sql import func
from app.database import Base


class Miner(Base):
    __tablename__ = "miners"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(255), nullable=False)
    brand = Column(String(100), nullable=False)
    type = Column(String(10), nullable=False)          # ASIC / GPU
    hashrate = Column(Float, nullable=False)            # TH/s normalized
    hashrate_unit = Column(String(20), default="TH/s")
    power_consumption = Column(Integer, nullable=False) # Watts
    efficiency = Column(Float, nullable=True)           # J/TH
    supported_coins = Column(String(500), nullable=True)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())

    __table_args__ = (
        UniqueConstraint("name", "hashrate", name="uq_miner_name_hashrate"),
        Index("idx_miner_type", "type"),
        Index("idx_miner_brand", "brand"),
        Index("idx_miner_hashrate", "hashrate"),
    )

    def is_complete(self) -> bool:
        return all([
            self.name,
            self.brand,
            self.type,
            self.hashrate,
            self.power_consumption,
            self.supported_coins,
        ])

    def to_dict(self) -> dict:
        return {
            "id": self.id,
            "name": self.name,
            "brand": self.brand,
            "type": self.type,
            "hashrate": self.hashrate,
            "hashrate_unit": self.hashrate_unit,
            "power_consumption": self.power_consumption,
            "efficiency": self.efficiency,
            "supported_coins": self.supported_coins,
            "created_at": self.created_at.isoformat() if self.created_at else None,
            "updated_at": self.updated_at.isoformat() if self.updated_at else None,
        }
