"""
BIOS Baseline 모델
backend/models/bios_baseline.py

Redfish로 가져온 표준 BIOS 설정을 저장하고 관리하는 모델
"""

from datetime import datetime
from backend.models.user import db

class BiosBaseline(db.Model):
    """BIOS 설정 기준값 모델 - Redfish로 가져온 표준 설정"""
    __tablename__ = 'bios_baselines'
    
    id = db.Column(db.Integer, primary_key=True)
    
    # 기본 정보
    name = db.Column(db.String(100), nullable=False, unique=True)  # 예: "R6615_GPU_Standard_2024"
    server_model = db.Column(db.String(100), nullable=False)  # 예: "PowerEdge R6615"
    server_type = db.Column(db.String(50))  # 예: "GPU Server", "Storage Server"
    description = db.Column(db.String(500))  # 설명
    
    # Redfish로 가져온 원본 데이터
    bios_data = db.Column(db.JSON, nullable=False)  # BIOS 설정값 전체 (JSON)
    bios_metadata = db.Column(db.JSON, nullable=True) # BIOS 메타데이터 (AttributeName -> DisplayName 매핑)
    idrac_data = db.Column(db.JSON, nullable=True)  # iDRAC 설정값 (JSON)
    idrac_metadata = db.Column(db.JSON, nullable=True) # iDRAC 메타데이터 (DisplayName 매핑)
    raid_data = db.Column(db.JSON, nullable=True)   # RAID/Storage 구성 (JSON)
    nic_data = db.Column(db.JSON, nullable=True)    # NIC 설정 (Adapters)
    boot_data = db.Column(db.JSON, nullable=True)   # 부팅 설정 (Order)
    firmware_data = db.Column(db.JSON, nullable=True) # 펌웨어 목록
    
    # 메타데이터
    source_ip = db.Column(db.String(50))  # 이 baseline을 생성한 서버 IP
    source_service_tag = db.Column(db.String(50))  # 원본 서버 Service Tag
    bios_version = db.Column(db.String(50))  # BIOS 버전
    total_settings = db.Column(db.Integer)  # 총 설정 항목 수
    
    # 복사 관계 (어떤 baseline에서 복사되었는지)
    copied_from_id = db.Column(db.Integer, db.ForeignKey('bios_baselines.id'), nullable=True)
    
    # 상태 및 관리
    is_active = db.Column(db.Boolean, default=True)
    created_by = db.Column(db.String(100))  # 생성자
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    # 관계 설정
    copied_from = db.relationship('BiosBaseline', remote_side=[id], backref='copies')
    
    def to_dict(self, include_data=False):
        """
        딕셔너리로 변환
        include_data: True면 bios_data, idrac_data, raid_data 등 상세 데이터 포함 (상세 조회 시)
        """
        data = {
            'id': self.id,
            'name': self.name,
            'server_model': self.server_model,
            'server_type': self.server_type,
            'description': self.description,
            'source_ip': self.source_ip,
            'source_service_tag': self.source_service_tag,
            'bios_version': self.bios_version,
            'total_settings': self.total_settings,
            'copied_from_id': self.copied_from_id,
            'is_active': self.is_active,
            'created_by': self.created_by,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
        
        if include_data:
            data['bios_data'] = self.bios_data
            data['bios_metadata'] = self.bios_metadata
            data['idrac_data'] = self.idrac_data
            data['idrac_metadata'] = self.idrac_metadata
            data['raid_data'] = self.raid_data
            data['nic_data'] = self.nic_data
            data['boot_data'] = self.boot_data
            data['firmware_data'] = self.firmware_data
            
        return data
    
    def __repr__(self):
        return f'<BiosBaseline {self.name} ({self.server_model})>'
