"""Remove demo accounts and seeded/fake content; preserve legacy imported data by default."""
from django.contrib.auth import get_user_model
from django.core.management import call_command
from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import Q

from ats.models import ApplicationEvent, ApplicationNote, Interview
from blog.models import BlogPost
from blog.management.commands.seed_blog import POSTS as SEED_BLOG_POSTS
from companies.models import Company
from companies.management.commands.seed_companies import SEED_COMPANIES
from home.models import ContactMessage
from jobs.models import Job, JobApplication, JobCategory, SavedJob
from jobs.management.commands.seed_jobs import SEED_JOBS
from messaging.models import Conversation, Message
from podcast.models import PodcastEpisode
from podcast.management.commands.seed_podcast import EPISODES as SEED_PODCAST_EPISODES
from seekers.models import SeekerProfile
from seekers.management.commands.seed_seekers import SEED_SEEKERS
from subscriptions.models import SeekerSubscription
from testimonials.models import Testimonial
from testimonials.management.commands.seed_testimonials import STORIES as SEED_TESTIMONIALS

User = get_user_model()

DEMO_USER_EMAILS = (
    'seeker@pezajob.com',
    'seeker.plus@pezajob.com',
    'employer@pezajob.com',
    'test@pezajob.com',
)
DEMO_USERNAMES = (
    'demo_seeker',
    'demo_seeker_plus',
    'demo_employer',
    'testuser',
)
DEMO_JOB_SLUGS = ('demo-python-developer-lusaka',)
EXTRA_DEMO_SEEKER_SLUGS = ('grace-banda', 'tendai-ncube')


class Command(BaseCommand):
    help = (
        'Remove demo accounts and seeded/fake content. '
        'By default keeps legacy imported jobs, companies, and real user accounts.'
    )

    def add_arguments(self, parser):
        parser.add_argument(
            '--all',
            action='store_true',
            help='Remove ALL content (jobs, profiles, companies, etc.), not just demo/seed data',
        )
        parser.add_argument(
            '--reseed-plans',
            action='store_true',
            help='Re-run seed_plans after clearing (only used with --all)',
        )

    @transaction.atomic
    def handle(self, *args, **options):
        if options['all']:
            deleted = self._clear_everything()
            if options['reseed_plans']:
                call_command('seed_plans', verbosity=0)
            total = sum(deleted.values())
            self._report(deleted, total, 'All content cleared.')
            return

        deleted = self._clear_demo_and_seed_only()
        total = sum(deleted.values())
        self._report(deleted, total, 'Demo and fake data removed. Legacy content preserved.')

    def _report(self, deleted, total, summary):
        for label, count in deleted.items():
            if count:
                self.stdout.write(f'  Removed {count} {label.replace("_", " ")}')
        self.stdout.write(self.style.SUCCESS(f'{summary} ({total} records removed)'))

    def _clear_everything(self):
        deleted = {}
        deleted['messages'] = Message.objects.all().delete()[0]
        deleted['conversations'] = Conversation.objects.all().delete()[0]
        deleted['application_events'] = ApplicationEvent.objects.all().delete()[0]
        deleted['application_notes'] = ApplicationNote.objects.all().delete()[0]
        deleted['interviews'] = Interview.objects.all().delete()[0]
        deleted['job_applications'] = JobApplication.objects.all().delete()[0]
        deleted['saved_jobs'] = SavedJob.objects.all().delete()[0]
        deleted['jobs'] = Job.objects.all().delete()[0]
        deleted['job_categories'] = JobCategory.objects.all().delete()[0]
        deleted['seeker_profiles'] = SeekerProfile.objects.all().delete()[0]
        deleted['companies'] = Company.objects.all().delete()[0]
        deleted['blog_posts'] = BlogPost.objects.all().delete()[0]
        deleted['podcast_episodes'] = PodcastEpisode.objects.all().delete()[0]
        deleted['testimonials'] = Testimonial.objects.all().delete()[0]
        deleted['contact_messages'] = ContactMessage.objects.all().delete()[0]
        return deleted

    def _clear_demo_and_seed_only(self):
        deleted = {}

        demo_users = User.objects.filter(
            Q(email__in=DEMO_USER_EMAILS) | Q(username__in=DEMO_USERNAMES)
        )
        demo_user_ids = list(demo_users.values_list('pk', flat=True))

        seed_job_slugs = {job['slug'] for job in SEED_JOBS} | set(DEMO_JOB_SLUGS)
        seed_company_slugs = {company['slug'] for company in SEED_COMPANIES}
        seed_seeker_slugs = {seeker['slug'] for seeker in SEED_SEEKERS} | set(EXTRA_DEMO_SEEKER_SLUGS)
        seed_blog_slugs = {post['slug'] for post in SEED_BLOG_POSTS}
        seed_podcast_slugs = {episode['slug'] for episode in SEED_PODCAST_EPISODES}

        demo_jobs = Job.objects.filter(slug__in=seed_job_slugs)
        demo_job_ids = list(demo_jobs.values_list('pk', flat=True))

        demo_applications = JobApplication.objects.filter(
            Q(applicant_id__in=demo_user_ids)
            | Q(job_id__in=demo_job_ids)
            | Q(job__posted_by_id__in=demo_user_ids)
        )
        demo_application_ids = list(demo_applications.values_list('pk', flat=True))

        demo_conversations = Conversation.objects.filter(application_id__in=demo_application_ids)
        deleted['messages'] = Message.objects.filter(conversation__in=demo_conversations).delete()[0]
        deleted['conversations'] = demo_conversations.delete()[0]
        deleted['application_events'] = ApplicationEvent.objects.filter(
            application_id__in=demo_application_ids
        ).delete()[0]
        deleted['application_notes'] = ApplicationNote.objects.filter(
            application_id__in=demo_application_ids
        ).delete()[0]
        deleted['interviews'] = Interview.objects.filter(
            application_id__in=demo_application_ids
        ).delete()[0]
        deleted['job_applications'] = demo_applications.delete()[0]
        deleted['saved_jobs'] = SavedJob.objects.filter(job_id__in=demo_job_ids).delete()[0]
        deleted['jobs'] = demo_jobs.delete()[0]

        deleted['seeker_subscriptions'] = SeekerSubscription.objects.filter(
            user_id__in=demo_user_ids
        ).delete()[0]
        deleted['seeker_profiles'] = SeekerProfile.objects.filter(
            Q(slug__in=seed_seeker_slugs) | Q(user_id__in=demo_user_ids)
        ).delete()[0]
        deleted['demo_users'] = demo_users.delete()[0]

        deleted['companies'] = Company.objects.filter(slug__in=seed_company_slugs).delete()[0]
        deleted['blog_posts'] = BlogPost.objects.filter(slug__in=seed_blog_slugs).delete()[0]
        deleted['podcast_episodes'] = PodcastEpisode.objects.filter(
            slug__in=seed_podcast_slugs
        ).delete()[0]

        testimonial_filter = Q()
        for story in SEED_TESTIMONIALS:
            testimonial_filter |= Q(full_name=story['full_name'], role=story['role'])
        deleted['seed_testimonials'] = Testimonial.objects.filter(testimonial_filter).delete()[0]
        deleted['spam_testimonials'] = Testimonial.objects.filter(
            story__icontains='fvsdrxrexde'
        ).delete()[0]

        return deleted
