import nepali_datetime
from django.core.management.base import BaseCommand
from record.models import Submission


class Command(BaseCommand):
    help = "Backfill Nepali date fields (year, month, day, quarter) for all existing Submission records."

    def handle(self, *args, **options):
        submissions = Submission.objects.filter(nepali_year__isnull=True)
        total = submissions.count()

        if total == 0:
            self.stdout.write(self.style.SUCCESS("All records already have Nepali dates populated. Nothing to do."))
            return

        self.stdout.write(f"Backfilling Nepali dates for {total} submission(s)...")
        updated = 0
        failed = 0

        for submission in submissions.iterator():
            ref_date = submission.submitted_at.date() if submission.submitted_at else None
            if not ref_date:
                failed += 1
                continue
            try:
                nd = nepali_datetime.date.from_datetime_date(ref_date)
                submission.nepali_year = nd.year
                submission.nepali_month = nd.month
                submission.nepali_day = nd.day

                if nd.month in (4, 5, 6):
                    submission.nepali_quarter = 1
                elif nd.month in (7, 8, 9):
                    submission.nepali_quarter = 2
                elif nd.month in (10, 11, 12):
                    submission.nepali_quarter = 3
                else:
                    submission.nepali_quarter = 4

                # Use update_fields to skip re-running save() logic
                Submission.objects.filter(pk=submission.pk).update(
                    nepali_year=submission.nepali_year,
                    nepali_month=submission.nepali_month,
                    nepali_day=submission.nepali_day,
                    nepali_quarter=submission.nepali_quarter,
                )
                updated += 1
            except Exception as e:
                self.stderr.write(f"  Failed for ID {submission.pk}: {e}")
                failed += 1

        self.stdout.write(self.style.SUCCESS(f"Done. Updated: {updated}, Failed: {failed}"))
