from django.db import migrations


def forwards(apps, schema_editor):
    StockTransfer = apps.get_model("shop_management", "StockTransfer")
    Purchase = apps.get_model("shop_management", "Purchase")
    PurchaseItem = apps.get_model("shop_management", "PurchaseItem")
    Stock = apps.get_model("shop_management", "Stock")

    transfer_table = StockTransfer._meta.db_table
    stock_table = Stock._meta.db_table
    purchase_table = Purchase._meta.db_table
    purchase_item_table = PurchaseItem._meta.db_table

    with schema_editor.connection.cursor() as cursor:
        cursor.execute(
            f"""
            SELECT
                ts.purchase_item_id AS target_purchase_item_id,
                st.currency_id AS transfer_currency_id,
                p.currency_id AS source_purchase_currency_id
            FROM {transfer_table} st
            LEFT JOIN {stock_table} ss ON ss.id = st.source_stock_id
            LEFT JOIN {purchase_item_table} spi ON spi.id = ss.purchase_item_id
            LEFT JOIN {purchase_table} p ON p.id = spi.purchase_id
            LEFT JOIN {stock_table} ts ON ts.id = st.target_stock_id
            WHERE st.status = %s
              AND st.target_stock_id IS NOT NULL
            """,
            ["accepted"],
        )
        rows = cursor.fetchall()

    target_purchase_item_ids = [row[0] for row in rows if row[0]]
    target_purchase_items = {
        item.id: item
        for item in PurchaseItem.objects.filter(id__in=target_purchase_item_ids)
    }

    for target_purchase_item_id, transfer_currency_id, source_purchase_currency_id in rows:
        if not target_purchase_item_id:
            continue
        purchase_item = target_purchase_items.get(target_purchase_item_id)
        if not purchase_item:
            continue
        currency_id = transfer_currency_id or source_purchase_currency_id
        if not currency_id:
            continue
        purchase_item.currency_id = currency_id
        purchase_item.save(update_fields=["currency"])


def backwards(apps, schema_editor):
    StockTransfer = apps.get_model("shop_management", "StockTransfer")
    PurchaseItem = apps.get_model("shop_management", "PurchaseItem")
    Stock = apps.get_model("shop_management", "Stock")

    transfer_table = StockTransfer._meta.db_table
    stock_table = Stock._meta.db_table
    purchase_item_table = PurchaseItem._meta.db_table

    with schema_editor.connection.cursor() as cursor:
        cursor.execute(
            f"""
            SELECT ts.purchase_item_id
            FROM {transfer_table} st
            LEFT JOIN {stock_table} ts ON ts.id = st.target_stock_id
            WHERE st.status = %s
              AND st.target_stock_id IS NOT NULL
            """,
            ["accepted"],
        )
        purchase_item_ids = [row[0] for row in cursor.fetchall() if row[0]]

    PurchaseItem.objects.filter(id__in=purchase_item_ids).update(currency_id=None)


class Migration(migrations.Migration):

    dependencies = [
        ("shop_management", "0063_purchaseitem_currency"),
    ]

    operations = [
        migrations.RunPython(forwards, backwards),
    ]
