"""
펌웨어 버전 관리 모델
backend/models/firmware_version.py
"""

from backend.models.user import db
from datetime import datetime
from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text


class FirmwareVersion(db.Model):
    """펌웨어 최신 버전 정보 모델"""
    __tablename__ = 'firmware_versions'
    
    id = Column(Integer, primary_key=True)
    
    # 컴포넌트 정보
    component_name = Column(String(100), nullable=False)  # BIOS, iDRAC, PERC 등
    component_type = Column(String(50))  # Firmware, Driver 등
    vendor = Column(String(50))  # Dell, Intel, Broadcom 등
    
    # 서버 모델 (선택적)
    server_model = Column(String(100))  # PowerEdge R750, R640 등 (비어있으면 모든 모델)
    
    # 버전 정보
    latest_version = Column(String(50), nullable=False)  # 최신 버전
    release_date = Column(String(20))  # 릴리즈 날짜
    
    # 다운로드 정보
    download_url = Column(String(500))  # DUP 파일 다운로드 URL
    file_name = Column(String(200))  # DUP 파일명
    file_size_mb = Column(Integer)  # 파일 크기 (MB)
    
    # 메타 정보
    notes = Column(Text)  # 비고 (버전 변경 사항 등)
    is_critical = Column(Boolean, default=False)  # 중요 업데이트 여부
    is_active = Column(Boolean, default=True)  # 활성화 여부
    
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    def to_dict(self):
        """딕셔너리로 변환"""
        return {
            'id': self.id,
            'component_name': self.component_name,
            'component_type': self.component_type,
            'vendor': self.vendor,
            'server_model': self.server_model,
            'latest_version': self.latest_version,
            'release_date': self.release_date,
            'download_url': self.download_url,
            'file_name': self.file_name,
            'file_size_mb': self.file_size_mb,
            'notes': self.notes,
            'is_critical': self.is_critical,
            'is_active': self.is_active,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
    
    def __repr__(self):
        return f'<FirmwareVersion {self.component_name} {self.latest_version}>'


class FirmwareComparisonResult:
    """펌웨어 버전 비교 결과"""
    
    def __init__(self, component_name, current_version, latest_version=None):
        self.component_name = component_name
        self.current_version = current_version
        self.latest_version = latest_version
        self.status = self._compare_versions()
        self.recommendation = self._get_recommendation()
    
    def _compare_versions(self):
        """버전 비교"""
        if not self.latest_version:
            return 'unknown'  # 최신 버전 정보 없음
        
        if self.current_version == self.latest_version:
            return 'latest'  # 최신
        
        # 버전 비교 (단순 문자열 비교보다 정교하게)
        if self._is_older(self.current_version, self.latest_version):
            return 'outdated'  # 업데이트 필요
        else:
            return 'unknown'  # 판단 불가
    
    def _is_older(self, current, latest):
        """
        버전 비교 (간단한 버전 비교)
        예: 2.10.0 < 2.15.0
        """
        try:
            # 버전 문자열을 숫자 리스트로 변환
            current_parts = [int(x) for x in current.replace('-', '.').split('.') if x.isdigit()]
            latest_parts = [int(x) for x in latest.replace('-', '.').split('.') if x.isdigit()]
            
            # 길이 맞추기
            max_len = max(len(current_parts), len(latest_parts))
            current_parts += [0] * (max_len - len(current_parts))
            latest_parts += [0] * (max_len - len(latest_parts))
            
            # 비교
            for c, l in zip(current_parts, latest_parts):
                if c < l:
                    return True
                elif c > l:
                    return False
            
            return False  # 같음
            
        except:
            # 비교 실패 시 문자열 비교
            return current < latest
    
    def _get_recommendation(self):
        """권장 사항"""
        if self.status == 'outdated':
            return f'업데이트 권장: {self.current_version} → {self.latest_version}'
        elif self.status == 'latest':
            return '최신 버전'
        else:
            return '버전 정보 확인 필요'
    
    def to_dict(self):
        return {
            'component_name': self.component_name,
            'current_version': self.current_version,
            'latest_version': self.latest_version,
            'status': self.status,
            'recommendation': self.recommendation
        }
