from django.db import migrations, models
import django.db.models.deletion


def mark_existing_journals_posted(apps, schema_editor):
    ManualJournalEntry = apps.get_model("finance_and_accounting", "ManualJournalEntry")
    AccountHistory = apps.get_model("finance_and_accounting", "AccountHistory")

    ManualJournalEntry.objects.filter(recycle_bin=False).update(status="posted")

    for hist in AccountHistory.objects.filter(rel_type="journal_entry").exclude(rel_id__isnull=True):
        ManualJournalEntry.objects.filter(id=hist.rel_id).update(status="posted")
        hist.journal_entry_id = hist.rel_id
        hist.save(update_fields=["journal_entry_id"])


class Migration(migrations.Migration):

    dependencies = [
        ("finance_and_accounting", "0012_seed_default_account_types"),
    ]

    operations = [
        migrations.AddField(
            model_name="manualjournalentry",
            name="status",
            field=models.CharField(
                choices=[
                    ("draft", "Draft"),
                    ("posted", "Posted"),
                    ("reversed", "Reversed"),
                    ("cancelled", "Cancelled"),
                ],
                default="draft",
                max_length=12,
            ),
        ),
        migrations.AddField(
            model_name="manualjournalentry",
            name="source_type",
            field=models.CharField(
                choices=[
                    ("manual", "Manual Entry"),
                    ("sales_invoice", "Sales Invoice"),
                    ("customer_payment", "Customer Payment"),
                    ("expense", "Expense"),
                    ("deposit", "Deposit"),
                    ("payroll", "Payroll"),
                    ("purchase", "Purchase / AP"),
                    ("inventory", "Inventory"),
                    ("depreciation", "Depreciation"),
                    ("year_end", "Year-End Close"),
                    ("reversal", "Reversal"),
                    ("other", "Other"),
                ],
                default="manual",
                max_length=30,
            ),
        ),
        migrations.AddField(
            model_name="manualjournalentry",
            name="source_id",
            field=models.CharField(blank=True, default="", max_length=100),
        ),
        migrations.AddField(
            model_name="manualjournalentry",
            name="reversal_of",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="reversal_entries",
                to="finance_and_accounting.manualjournalentry",
            ),
        ),
        migrations.AddField(
            model_name="manualjournalentry",
            name="posted_at",
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name="manualjournalentry",
            name="posted_by",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="manual_journal_posted_by",
                to="human_resource.staffprofile",
            ),
        ),
        migrations.AddField(
            model_name="accounthistory",
            name="journal_entry",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.SET_NULL,
                related_name="ledger_lines",
                to="finance_and_accounting.manualjournalentry",
            ),
        ),
        migrations.RunPython(mark_existing_journals_posted, migrations.RunPython.noop),
    ]
