from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from app.models.gpu_usage import GpuUsage
import logging

class GpuWriter:
    def __init__(self, database_url):
        """
        初始化 GpuWriter
        :param database_url: 数据库连接URL
        """
        self.engine = create_engine(database_url)
        self.Session = sessionmaker(bind=self.engine)
    
    def write_gpu_usage(self, gpu_id, gpu_usage, gpu_memory_usage):
        """
        写入GPU使用情况到数据库
        :param gpu_id: GPU编号
        :param gpu_usage: GPU使用率（百分比）
        :param gpu_memory_usage: GPU内存用量（MB）
        :return: bool 是否写入成功
        """
        session = self.Session()
        try:
            gpu_record = GpuUsage(
                gpu_id=gpu_id,
                gpu_usage=gpu_usage,
                gpu_memory_usage=gpu_memory_usage
            )
            session.add(gpu_record)
            session.commit()
            return True
        except Exception as e:
            session.rollback()
            logging.error(f"写入GPU使用情况失败: {e}")
            return False
        finally:
            session.close()

    def get_latest_gpu_usage(self, limit=100):
        """
        获取最新的GPU使用情况记录
        :param limit: 获取记录条数，默认100条
        :return: list 包含GPU使用记录的字典列表
        """
        session = self.Session()
        try:
            records = session.query(GpuUsage)\
                           .order_by(GpuUsage.timestamp.desc())\
                           .limit(limit)\
                           .all()
            
            result = []
            for record in records:
                result.append({
                    'id': record.id,
                    'gpu_id': record.gpu_id,
                    'gpu_usage': record.gpu_usage,
                    'gpu_memory_usage': record.gpu_memory_usage,
                    'timestamp': record.timestamp.isoformat() if record.timestamp else None
                })
            
            return result
        except Exception as e:
            logging.error(f"获取GPU使用情况失败: {e}")
            return []
        finally:
            session.close()
