from services.vulnerability_intelligence.handlers.base_handler import BaseHandler
from models.vulnerability_intelligence import VulnerabilityIntelligence

import logging
from dateutil import parser as dateutil_parser

class VulnersHandler(BaseHandler):
    def apply(self, vuln_intelligence: VulnerabilityIntelligence):
        try:
            related_urls = self.data.get('vulners_related_urls', [])
            vuln_intelligence.reference_urls.update(related_urls)

            cvss_score = self.data.get('vulners_cvss_score')
            publish_date = self.data.get('vulners_publish_date')
            date = self._parse_date(publish_date)

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

            severity = self.data.get('vulners_base_severity')
            if severity:
                vuln_intelligence.severities.append({
                    "source": self.enrich_source_name("Vulners"),
                    "severity": severity,
                    "date": date
                })

            vulners_tags = self.data.get('vulners_tags', [])
            vuln_intelligence.tags.update(vulners_tags)

            vulners_description = self.data.get('vulners_description')
            if vulners_description:
                formatted_description = vulners_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("Vulners"),
                        "text": formatted_description,
                        "date": date
                    })

        except Exception as e:
            logging.error(f"Error applying Vulners 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:
            logging.error(f"Error parsing date '{date_str}': {e}")
            return "N/A"
