from enum import Enum
from typing import List, Optional, Dict

from models.vulnerability import Vulnerability
from services.api.source import Source

class VulnerabilityDefaults(Enum):
    NOT_AVAILABLE = "N/A"

DEFAULT_VALUES = {
    "id": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "source": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "url": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "reference_urls": [],
    "base_score": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "base_severity": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "title": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "description": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "vulnerable_components": [],
    "tags": [],
    "date": VulnerabilityDefaults.NOT_AVAILABLE.value,
    "weaknesses": [],
}

class VulnerabilityFactory:
    @staticmethod
    def make(
        id: Optional[str] = None,
        source: Optional[Source] = None,
        url: Optional[str] = None, 
        reference_urls: Optional[List[str]] = None,
        base_score: Optional[str] = None,
        base_severity: Optional[str] = None,
        title: Optional[str] = None,
        description: Optional[str] = None,
        vulnerable_components: Optional[List[str]] = None,
        date: Optional[str] = None,
        tags: Optional[List[str]] = None,
        weaknesses: Optional[List[str]] = None,
    ):
        return Vulnerability(
            id or DEFAULT_VALUES["id"],
            source or DEFAULT_VALUES["source"],
            url or DEFAULT_VALUES["url"],
            reference_urls if reference_urls is not None else DEFAULT_VALUES["reference_urls"].copy(),
            base_score or DEFAULT_VALUES["base_score"],
            base_severity or DEFAULT_VALUES["base_severity"],
            title or DEFAULT_VALUES["title"],
            description or DEFAULT_VALUES["description"],
            vulnerable_components if vulnerable_components is not None else DEFAULT_VALUES["vulnerable_components"],
            tags if tags is not None else DEFAULT_VALUES["tags"],
            date or DEFAULT_VALUES["date"],
            weaknesses if weaknesses is not None else DEFAULT_VALUES["weaknesses"],
        )
