"""Modèles SQLAlchemy - Base de données HSBG AI.""" from datetime import datetime from sqlalchemy import ( Column, Integer, String, Float, Boolean, Text, DateTime, JSON, ForeignKey ) from sqlalchemy.orm import DeclarativeBase, relationship class Base(DeclarativeBase): pass class Hero(Base): __tablename__ = "heroes" id = Column(Integer, primary_key=True, index=True) card_id = Column(String(64), unique=True, index=True, nullable=False) name = Column(String(128), nullable=False) hero_power = Column(Text, default="") hp_cost = Column(Integer, default=0) hp_cooldown = Column(Integer, default=0) description = Column(Text, default="") strengths = Column(JSON, default=list) weaknesses = Column(JSON, default=list) synergies = Column(JSON, default=list) tier_rating = Column(Float, default=5.0) patch_added = Column(String(16), default="") is_active = Column(Boolean, default=True) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class Minion(Base): __tablename__ = "minions" id = Column(Integer, primary_key=True, index=True) card_id = Column(String(64), unique=True, index=True, nullable=False) name = Column(String(128), nullable=False) tier = Column(String(2), nullable=False, default="1") race = Column(JSON, default=list) attack = Column(Integer, default=0) health = Column(Integer, default=0) tavern_cost = Column(Integer, default=3) is_golden = Column(Boolean, default=False) has_divine = Column(Boolean, default=False) has_taunt = Column(Boolean, default=False) has_windfury = Column(Boolean, default=False) has_poisonous = Column(Boolean, default=False) has_reborn = Column(Boolean, default=False) battlecry = Column(Text, default="") deathrattle = Column(Text, default="") on_attack = Column(Text, default="") passive = Column(Text, default="") synergies = Column(JSON, default=list) keywords = Column(JSON, default=list) patch_added = Column(String(16), default="") is_active = Column(Boolean, default=True) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class Spell(Base): __tablename__ = "spells" id = Column(Integer, primary_key=True, index=True) card_id = Column(String(64), unique=True, index=True, nullable=False) name = Column(String(128), nullable=False) tier = Column(String(2), default="1") cost = Column(Integer, default=0) effect = Column(Text, default="") target = Column(String(64), default="minion") keywords = Column(JSON, default=list) is_active = Column(Boolean, default=True) created_at = Column(DateTime, default=datetime.utcnow) class GameSession(Base): __tablename__ = "game_sessions" id = Column(Integer, primary_key=True, index=True) started_at = Column(DateTime, default=datetime.utcnow) ended_at = Column(DateTime, nullable=True) hero_id = Column(Integer, ForeignKey("heroes.id"), nullable=True) final_place = Column(Integer, nullable=True) total_turns = Column(Integer, default=0) is_active = Column(Boolean, default=True) session_meta = Column(JSON, default=dict) hero = relationship("Hero") decisions = relationship("AIDecision", back_populates="session") class AIDecision(Base): __tablename__ = "ai_decisions" id = Column(Integer, primary_key=True, index=True) session_id = Column(Integer, ForeignKey("game_sessions.id"), nullable=False) turn = Column(Integer, default=0) phase = Column(String(32), default="recruit") game_state = Column(JSON, default=dict) recommendation = Column(JSON, default=dict) reasoning = Column(Text, default="") confidence = Column(Float, default=0.5) was_followed = Column(Boolean, nullable=True) outcome_rating = Column(Integer, nullable=True) user_feedback = Column(Text, nullable=True) better_decision = Column(JSON, nullable=True) model_used = Column(String(64), default="heuristic") processing_ms = Column(Integer, default=0) created_at = Column(DateTime, default=datetime.utcnow) session = relationship("GameSession", back_populates="decisions") class LearningFeedback(Base): __tablename__ = "learning_feedback" id = Column(Integer, primary_key=True, index=True) decision_id = Column(Integer, ForeignKey("ai_decisions.id"), nullable=False) rating = Column(String(8), default="neutral") better_action = Column(JSON, nullable=True) comment = Column(Text, nullable=True) trained = Column(Boolean, default=False) created_at = Column(DateTime, default=datetime.utcnow) decision = relationship("AIDecision") class Patch(Base): __tablename__ = "patches" id = Column(Integer, primary_key=True, index=True) version = Column(String(16), unique=True, nullable=False) release_date = Column(DateTime) changes = Column(JSON, default=dict) notes = Column(Text, default="") created_at = Column(DateTime, default=datetime.utcnow)