from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


def classify_legacy_transactions(apps, schema_editor):
    Transaction = apps.get_model("shop_management", "AccountTransaction")
    patterns = {
        "Supplier payment service charge": "SUPPLIER_PAYMENT_FEE",
        "Supplier payment": "SUPPLIER_PAYMENT",
        "Customer payment": "CUSTOMER_PAYMENT",
        "Expense": "EXPENSE",
        "Controlled transfer out": "ACCOUNT_TRANSFER_OUT",
        "Controlled transfer in": "ACCOUNT_TRANSFER_IN",
        "Transfer service charge": "ACCOUNT_TRANSFER_FEE",
    }
    for prefix, source_type in patterns.items():
        Transaction.objects.filter(description__istartswith=prefix).update(
            source_type=source_type,
            is_system_generated=True,
        )


class Migration(migrations.Migration):
    dependencies = [
        ("shop_management", "0101_legacy_stock_quantity_nonnegative"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.AlterField(
            model_name="accounttransaction", name="account",
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="transactions", to="shop_management.account"),
        ),
        migrations.AddField(
            model_name="account",
            name="allow_overdraft",
            field=models.BooleanField(default=False, help_text="Allow this account to go below zero when an authorized payment is posted."),
        ),
        migrations.AddField(model_name="accounttransaction", name="reference", field=models.CharField(blank=True, max_length=100)),
        migrations.AddField(model_name="accounttransaction", name="source_type", field=models.CharField(blank=True, default="MANUAL", max_length=50)),
        migrations.AddField(model_name="accounttransaction", name="source_id", field=models.CharField(blank=True, max_length=100)),
        migrations.AddField(model_name="accounttransaction", name="is_system_generated", field=models.BooleanField(default=False)),
        migrations.AddField(
            model_name="accounttransaction", name="created_by",
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="account_transactions_created", to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name="accounttransaction", name="reversed_transaction",
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="reversal_entries", to="shop_management.accounttransaction"),
        ),
        migrations.AddField(model_name="accounttransaction", name="reversed_at", field=models.DateTimeField(blank=True, null=True)),
        migrations.AddField(
            model_name="accounttransaction", name="reversed_by",
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="account_transactions_reversed", to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(model_name="accounttransaction", name="reversal_reason", field=models.TextField(blank=True)),
        migrations.RunPython(classify_legacy_transactions, migrations.RunPython.noop),
    ]
