from services.vulnerability_intelligence.handlers.base_handler import BaseHandler
from models.vulnerability_intelligence import VulnerabilityIntelligence
from dateutil import parser as dateutil_parser

class NistCachedHandler(BaseHandler):
    def apply(self, vuln_intelligence: VulnerabilityIntelligence):
        try:
            nist_description = self.data.get("nist_description")
            if nist_description:
                formatted_description = nist_description.replace('\n', ' ')
                if not any(desc["text"] == formatted_description for desc in vuln_intelligence.descriptions):
                    vuln_intelligence.descriptions.append({
                        "source": self.enrich_source_name("NIST"),
                        "text": formatted_description,
                        "date": self._parse_date(self.data.get("nist_date"))
                    })

            nist_base_score = self.data.get("nist_base_score")
            nist_base_severity = self.data.get("nist_base_severity")
            nist_date = self.data.get("nist_date")
            date = self._parse_date(nist_date)

            if nist_base_score:
                vuln_intelligence.base_scores.append({
                    "source": self.enrich_source_name("NIST"),
                    "score": nist_base_score,
                    "date": date
                })

            if nist_base_severity:
                vuln_intelligence.severities.append({
                    "source": self.enrich_source_name("NIST"),
                    "severity": nist_base_severity,
                    "date": date
                })

            reference_urls = self.data.get("nist_reference_urls", [])
            vuln_intelligence.reference_urls.update(reference_urls)

            vulnerable_components = self.data.get("nist_vulnerable_components", [])
            vuln_intelligence.vulnerable_components.update(vulnerable_components)

        except Exception as e:
            print(f"[!] Error applying NIST enrichment: {e}")

    def _parse_date(self, date_str: str) -> str:
        if not date_str:
            return "N/A"
        try:
            parsed_date = dateutil_parser.parse(date_str)
            return parsed_date.strftime("%Y-%m-%d")
        except Exception as e:
            print(f"[!] Error parsing date '{date_str}': {e}")
            return "N/A"
