from django import forms
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

from .models import ThreatScan


class ThreatScanForm(forms.Form):
    scan_type = forms.ChoiceField(
        choices=ThreatScan.ScanType.choices,
        widget=forms.RadioSelect,
        initial=ThreatScan.ScanType.URL,
        label="What do you want to scan?",
    )
    content = forms.CharField(
        label="URL, email, or message",
        max_length=5000,
        widget=forms.Textarea(attrs={
            "rows": 6,
            "placeholder": "Paste a suspicious URL, email, SMS, or chat message. Raw text is analyzed in-memory and not stored.",
        }),
    )
    store_metadata = forms.BooleanField(
        required=False,
        initial=True,
        label="Save privacy-safe metadata for my dashboard",
        help_text="Only a short sanitized preview, hash, score, and explanation are stored — not the raw submission.",
    )

    def clean_content(self):
        content = self.cleaned_data["content"].strip()
        if len(content) < 6:
            raise ValidationError("Please enter enough text to analyze.")
        return content

    def clean(self):
        cleaned = super().clean()
        scan_type = cleaned.get("scan_type")
        content = cleaned.get("content")
        if scan_type == ThreatScan.ScanType.URL and content:
            candidate = content.strip()
            if not candidate.startswith(("http://", "https://")):
                candidate = f"https://{candidate}"
            try:
                URLValidator()(candidate)
            except ValidationError as exc:
                raise ValidationError("Enter a valid URL, or switch the scan type to Email / Message.") from exc
            cleaned["content"] = candidate
        return cleaned
