from django.core.files.base import ContentFile
from django.test import TestCase, override_settings
from django.urls import reverse

from accounts.models import User
from companies.models import Company
from jobs.models import Job, JobCategory

PNG = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89'
       b'\x00\x00\x00\rIDATx\x9cc\xf8\xff\xff?\x00\x05\xfe\x02\xfe\xa7\x9a\xa0\xa0\x00\x00\x00\x00IEND\xaeB`\x82')


@override_settings(MEDIA_ROOT='C:/Windows/Temp/pezajob_test_media')
class CompanyLogoTests(TestCase):
    def setUp(self):
        self.owner = User.objects.create_user(username='own', email='own@x.com', password='pw12345!', role=User.Role.COMPANY)
        self.owner.avatar.save('logo.png', ContentFile(PNG), save=True)
        self.company = Company.objects.create(slug='acme', name='Acme Ltd', initials='AL', industry='Retail', industry_slug='retail',
                                              location='Lusaka', owner=self.owner, description='We sell things.', tags='Retail, Wholesale\nFMCG')
        cat = JobCategory.objects.create(name='Retail T', slug='retail-t')
        self.job = Job.objects.create(title='Cashier', slug='cashier-acme', company_name='Acme Ltd', company_slug='acme', company_initials='AL',
                                      location='Lusaka', category=cat, description='d', requirements='r', posted_by=self.owner, is_active=True)

    def test_profile_page_shows_logo_and_details(self):
        html = self.client.get(self.company.get_absolute_url()).content.decode()
        self.assertIn(self.company.display_logo_url, html)
        self.assertIn('We sell things.', html)
        for tag in ('Retail', 'Wholesale', 'FMCG'):
            self.assertIn(tag, html)

    def test_directory_card_shows_logo(self):
        html = self.client.get(reverse('companies:list')).content.decode()
        self.assertIn(self.company.display_logo_url, html)

    def test_job_uses_its_own_companys_logo_not_the_admins(self):
        admin = User.objects.create_user(username='adm', email='adm@x.com', password='pw12345!', role=User.Role.ADMIN)
        admin.avatar.save('admin.png', ContentFile(PNG), save=True)
        other = Company.objects.create(slug='nologo', name='No Logo Co', initials='NL', industry='x', industry_slug='x', location='L')
        cat = JobCategory.objects.get(slug='retail-t')
        job = Job.objects.create(title='Clerk', slug='clerk-nl', company_name='No Logo Co', company_slug='nologo', company_initials='NL',
                                 location='L', category=cat, description='d', requirements='r', posted_by=admin, is_active=True)
        self.assertEqual(job.logo_url, '')
        self.assertEqual(self.job.logo_url, self.company.display_logo_url)

    def test_missing_logo_falls_back_to_initials(self):
        self.owner.avatar = None
        self.owner.save()
        html = self.client.get(self.company.get_absolute_url()).content.decode()
        self.assertIn('AL', html)
        self.assertNotIn('logo-img-fill', html)

    def test_no_stock_photo_is_shown_when_no_cover_uploaded(self):
        self.assertEqual(self.company.display_cover_url, '')
        self.company.cover_image_url = 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=600'
        self.assertEqual(self.company.display_cover_url, '')
        html = self.client.get(self.company.get_absolute_url()).content.decode()
        self.assertNotIn('unsplash', html)
        self.company.cover_image_url = 'https://example.com/real-cover.jpg'
        self.assertEqual(self.company.display_cover_url, 'https://example.com/real-cover.jpg')

    def test_company_block_on_job_page_links_to_profile_or_to_that_companys_jobs(self):
        html = self.client.get(self.job.get_absolute_url()).content.decode()
        self.assertIn('class="company-brief company-brief-link" href="%s"' % self.company.get_absolute_url(), html)
        cat = self.job.category
        orphan = Job.objects.create(title='Clerk', slug='clerk-orphan', company_name='Unlisted Co', company_slug='unlisted-co', company_initials='UC',
                                    location='L', category=cat, description='d', requirements='r', posted_by=self.owner, is_active=True)
        html = self.client.get(orphan.get_absolute_url()).content.decode()
        self.assertIn('href="/jobs/?company=Unlisted%20Co"', html)


class HowToApplyTests(TestCase):
    def setUp(self):
        from accounts.models import User
        from jobs.models import JobCategory

        self.admin = User.objects.create_user(username='hadm', email='hadm@x.com', password='pw12345!', role=User.Role.ADMIN)
        self.cat = JobCategory.objects.create(name='Apply Cat', slug='apply-cat')

    def _job(self, methods, how):
        return Job.objects.create(title='Clerk', slug='clerk-apply-%s' % len(methods), company_name='Acme', company_slug='acme', company_initials='A',
                                  location='L', category=self.cat, description='d', requirements='r', posted_by=self.admin, is_active=True,
                                  application_methods=methods, how_to_apply=how)

    def test_both_methods_let_the_visitor_pick_one(self):
        job = self._job(['ats', 'email'], 'Send your CV to hr@acme.example\n\nOnly shortlisted candidates are contacted.')
        html = self.client.get(job.get_absolute_url()).content.decode()
        self.assertIn('apply-choices', html)
        self.assertIn('data-target="apply-pane-peza"', html)
        self.assertIn('data-target="apply-pane-email"', html)
        self.assertEqual(html.count('class="apply-pane"'), 2)
        self.assertIn('hr@acme.example', html)

    def test_email_only_shows_a_clear_email_card_and_tidy_instructions(self):
        job = self._job(['email'], 'Apply via email:\n\n\n\nhr@acme.example\n\n\nGood luck.')
        html = self.client.get(job.get_absolute_url()).content.decode()
        self.assertNotIn('apply-choices', html)
        self.assertIn('apply-email-card', html)
        self.assertIn('<p>Good luck.</p>', html)
