from django.core.exceptions import ValidationError
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase

from jobs.attachments import attachment_kind, save_job_attachments, validate_attachment_file
from jobs.models import Job, JobAttachment


class JobAttachmentTests(TestCase):
    def _job(self):
        return Job.objects.create(
            title='Sales & Marketing Executive',
            slug='sales-marketing-executive',
            company_name='VIZTRANIX',
            company_initials='VZ',
            location='Lusaka',
            description='We are hiring.',
            responsibilities='Sales',
            requirements='Experience',
        )

    def test_attachment_kind_detects_image_and_document(self):
        self.assertEqual(attachment_kind('flyer.jpg'), JobAttachment.Kind.IMAGE)
        self.assertEqual(attachment_kind('details.PDF'), JobAttachment.Kind.PDF)
        self.assertEqual(attachment_kind('notes.docx'), JobAttachment.Kind.PDF)
        self.assertEqual(attachment_kind('notes.doc'), JobAttachment.Kind.PDF)
        self.assertIsNone(attachment_kind('notes.txt'))

    def test_validate_rejects_unsupported_type(self):
        upload = SimpleUploadedFile('bad.exe', b'x', content_type='application/octet-stream')
        with self.assertRaises(ValidationError):
            validate_attachment_file(upload)

    def test_save_job_attachments(self):
        job = self._job()
        image = SimpleUploadedFile('viztranix-flyer.jpg', b'jpeg-bytes', content_type='image/jpeg')
        pdf = SimpleUploadedFile('job-description.pdf', b'%PDF-1.4', content_type='application/pdf')
        count = save_job_attachments(job, [image, pdf])
        self.assertEqual(count, 2)
        self.assertEqual(job.attachments.filter(kind=JobAttachment.Kind.IMAGE).count(), 1)
        self.assertEqual(job.attachments.filter(kind=JobAttachment.Kind.PDF).count(), 1)
