# -*- coding: utf-8 -*-
"""
部署相关模型

包含部署记录模型（状态日志已合并到 status_history JSON 字段）
"""

import json
from datetime import datetime
from .base import db, get_beijing_now
from .challenge import ChallengeRecord
from .user import User


class DeploymentRecord(db.Model):
    """部署记录模型"""
    __tablename__ = 'deployments'
    
    id = db.Column(db.Integer, primary_key=True)
    deployment_uuid = db.Column(db.String(50), unique=True, nullable=False)  # 部署的唯一标识符
    challenge_id = db.Column(db.Integer, db.ForeignKey('challenge_records.id', ondelete='CASCADE'))
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    status = db.Column(db.String(20), default='creating')  # creating, running, stopped, error, deleted
    container_id = db.Column(db.String(100))
    container_name = db.Column(db.String(100))
    working_directory = db.Column(db.String(255))  # 部署文件所在目录
    access_url = db.Column(db.String(255))
    external_port = db.Column(db.Integer)
    created_at = db.Column(db.DateTime, default=get_beijing_now)
    updated_at = db.Column(db.DateTime, default=get_beijing_now, onupdate=get_beijing_now)
    expires_at = db.Column(db.DateTime)
    status_history = db.Column(db.JSON, default=list)  # 状态历史日志（JSON 数组）
    
    # 关联
    challenge = db.relationship('ChallengeRecord', backref=db.backref('deployments', lazy='dynamic'))
    user = db.relationship('User', backref=db.backref('deployments', lazy='dynamic'))
    
    def get_status_history(self):
        """获取状态历史列表"""
        if self.status_history is None:
            return []
        if isinstance(self.status_history, str):
            try:
                return json.loads(self.status_history)
            except:
                return []
        return self.status_history if isinstance(self.status_history, list) else []
    
    def add_status_log(self, status: str, message: str = None):
        """添加状态日志
        
        Args:
            status: 状态
            message: 消息
        """
        history = self.get_status_history()
        log_entry = {
            'status': status,
            'message': message or '',
            'timestamp': get_beijing_now().isoformat()
        }
        history.append(log_entry)
        self.status_history = history
        # 更新当前状态
        self.status = status
        self.updated_at = get_beijing_now()
                                     
    def to_dict(self):
        """转换为字典"""
        return {
            'id': self.deployment_uuid,
            'deployment_uuid': self.deployment_uuid,  # 明确添加deployment_uuid字段
            'challenge_id': self.challenge_id,
            'user_id': self.user_id,
            'status': self.status,
            'container_id': self.container_id,
            'container_name': self.container_name,
            'working_directory': self.working_directory,
            'access_url': self.access_url,
            'external_port': self.external_port,
            'created_at': self.created_at,  # 直接返回datetime对象
            'updated_at': self.updated_at,  # 直接返回datetime对象
            'expires_at': self.expires_at,  # 直接返回datetime对象
            'status_history': self.get_status_history()
        }
        
    @staticmethod
    def from_dict(data):
        """从字典创建部署记录"""
        # 确保deployment_uuid存在
        deployment_uuid = data.get('deployment_uuid')
        if not deployment_uuid and 'id' in data:
            deployment_uuid = data.get('id')
            
        return DeploymentRecord(
            deployment_uuid=deployment_uuid,
            challenge_id=data.get('challenge_id'),
            user_id=data.get('user_id'),
            status=data.get('status', 'creating'),
            container_id=data.get('container_id'),
            container_name=data.get('container_name'),
            working_directory=data.get('working_directory'),
            access_url=data.get('access_url'),
            external_port=data.get('external_port'),
            expires_at=datetime.fromisoformat(data['expires_at']) if data.get('expires_at') else None
        )


# DeploymentStatusLog 模型已移除，状态日志现在存储在 DeploymentRecord.status_history JSON 字段中

