import secrets
import hashlib
from typing import Dict, Optional
from datetime import datetime, timedelta

class TempSshPasswordManager:
    """임시 SSH 비밀번호 관리"""
    
    def __init__(self):
        # 메모리 기반 저장소 (프로덕션에서는 Redis 사용 권장)
        self._passwords: Dict[str, dict] = {}
    
    def generate_password(self, username: str, validity_hours: int = 1) -> str:
        """
        임시 SSH 비밀번호 생성
        
        Args:
            username: 사용자명
            validity_hours: 유효 시간 (기본 1시간)
            
        Returns:
            임시 비밀번호
        """
        # 안전한 랜덤 비밀번호 생성 (32자)
        temp_password = secrets.token_urlsafe(32)
        
        # 해시 저장 (실제 비밀번호는 저장하지 않음)
        password_hash = hashlib.sha256(temp_password.encode()).hexdigest()
        
        # 만료 시간 계산
        expires_at = datetime.utcnow() + timedelta(hours=validity_hours)
        
        # 저장
        self._passwords[username] = {
            "password_hash": password_hash,
            "expires_at": expires_at,
            "created_at": datetime.utcnow()
        }
        
        return temp_password
    
    def verify_password(self, username: str, password: str) -> bool:
        """
        비밀번호 검증
        
        Args:
            username: 사용자명
            password: 검증할 비밀번호
            
        Returns:
            유효 여부
        """
        if username not in self._passwords:
            return False
        
        stored = self._passwords[username]
        
        # 만료 확인
        if datetime.utcnow() > stored["expires_at"]:
            del self._passwords[username]
            return False
        
        # 비밀번호 확인
        password_hash = hashlib.sha256(password.encode()).hexdigest()
        return password_hash == stored["password_hash"]
    
    def cleanup_expired(self):
        """만료된 비밀번호 정리"""
        now = datetime.utcnow()
        expired = [
            username for username, data in self._passwords.items()
            if now > data["expires_at"]
        ]
        for username in expired:
            del self._passwords[username]

# 싱글톤 인스턴스
temp_ssh_password_manager = TempSshPasswordManager()
