from django.test import SimpleTestCase

from claims.services.ai_assistant import _image_message_part, _svg_to_png_bytes
from claims.services.article_fetcher import (
    ArticleFetchError,
    _extract_readable_text,
    validate_article_url,
)


class ArticleFetcherSecurityTests(SimpleTestCase):
    def test_blocks_file_scheme(self):
        with self.assertRaises(ArticleFetchError):
            validate_article_url('file:///etc/passwd')

    def test_blocks_localhost(self):
        with self.assertRaises(ArticleFetchError):
            validate_article_url('http://localhost/article')

    def test_allows_https_url(self):
        validate_article_url('https://example.com/artikel')


class ArticleFetcherExtractionTests(SimpleTestCase):
    def test_strips_navigation_and_ads(self):
        html = """
        <html><body>
        <nav>Navigation mit vielen Links die ignoriert werden sollen</nav>
        <div class="sidebar-promo">Werbung für ein tolles Angebot heute nur hier</div>
        <article>
            <h1>Echter Artikeltitel über Klimawandel und Energiepolitik</h1>
            <p>Dies ist der eigentliche Artikeltext mit genügend Inhalt für die Extraktion.</p>
            <p>Ein zweiter Absatz mit relevanten Fakten zur Erderwärmung und Treibhausgasen.</p>
        </article>
        <footer>Impressum und Datenschutz und Cookie-Hinweise überall</footer>
        </body></html>
        """
        text = _extract_readable_text(html)
        self.assertIn('Klimawandel', text)
        self.assertNotIn('Navigation mit vielen', text)
        self.assertNotIn('Werbung für ein tolles', text)
        self.assertNotIn('Impressum', text)

    def test_handles_tags_without_attrs(self):
        html = """
        <html><body>
        <article>
            <h1>Überschrift mit genügend Zeichen für den Parser hier</h1>
            <p>Absatz mit ausreichend Inhalt damit die Extraktion erfolgreich klappt.</p>
        </article>
        </body></html>
        """
        text = _extract_readable_text(html)
        self.assertIn('Überschrift', text)


class AIAssistantUploadTests(SimpleTestCase):
    def test_svg_converts_to_png_for_openai(self):
        svg = b'''<?xml version="1.0" encoding="UTF-8"?>
        <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
            <rect width="100" height="100" fill="teal"/>
            <text x="10" y="50">Test</text>
        </svg>'''
        png = _svg_to_png_bytes(svg)
        self.assertIsNotNone(png)
        self.assertTrue(png.startswith(b'\x89PNG'))

    def test_svg_message_part_uses_png_data_url(self):
        from django.core.files.uploadedfile import SimpleUploadedFile

        svg = b'<svg xmlns="http://www.w3.org/2000/svg"><text y="20">Faktencheck</text></svg>'
        upload = SimpleUploadedFile('chart.svg', svg, content_type='image/svg+xml')
        part = _image_message_part(upload)
        if part['type'] == 'image_url':
            self.assertIn('image/png', part['image_url']['url'])
        else:
            self.assertIn('SVG-Grafik', part['text'])
