"""POS CSV import service — imports per-transaction data from POS exports."""

from decimal import Decimal

from sqlalchemy import delete, select
from sqlalchemy.ext.asyncio import AsyncSession

from app.models.pos_transaksi import PenjualanTransaksi
from app.models.operational import LaporanShift
from app.models.spbu import Nozzle
from app.utils.pos_csv_parser import parse_pos_csv


async def import_pos_csv(
    db: AsyncSession,
    spbu_id: int,
    laporan_shift_id: int,
    csv_content: str,
    user_id: int,
) -> dict:
    """
    Parse CSV and insert penjualan_transaksi records.
    Replaces existing transactions for this laporan_shift_id (idempotent).
    """
    # Validate laporan exists
    result = await db.execute(
        select(LaporanShift).where(
            LaporanShift.id == laporan_shift_id,
            LaporanShift.spbu_id == spbu_id,
        )
    )
    laporan = result.scalar_one_or_none()
    if not laporan:
        raise ValueError("Laporan shift tidak ditemukan")

    # Parse CSV
    parsed = parse_pos_csv(csv_content)

    # Build nozzle name → id map for this SPBU
    nozzle_result = await db.execute(
        select(Nozzle).where(Nozzle.island.has(spbu_id=spbu_id))
    )
    nozzles = nozzle_result.scalars().all()
    nozzle_map = {n.nama.lower(): n.id for n in nozzles if n.nama}

    # Delete existing transactions for this laporan
    await db.execute(
        delete(PenjualanTransaksi).where(
            PenjualanTransaksi.laporan_shift_id == laporan_shift_id
        )
    )

    # Insert new transactions
    inserted = 0
    skipped = 0
    for record in parsed:
        nozzle_id = None
        if record["nozzle_nama"]:
            nozzle_id = nozzle_map.get(record["nozzle_nama"].lower())

        txn = PenjualanTransaksi(
            laporan_shift_id=laporan_shift_id,
            nozzle_id=nozzle_id,
            plat_nomor=record["plat_nomor"],
            jenis_kendaraan=record["jenis_kendaraan"],
            volume=record["volume"],
            nilai=record["nilai"],
            timestamp=record["timestamp"],
        )
        db.add(txn)
        inserted += 1

    # Audit log
    from app.utils.audit import log_action
    await log_action(
        db, user_id=user_id, spbu_id=spbu_id,
        aksi="import", modul="penjualan",
        object_id=laporan_shift_id,
        detail={"csv_rows": len(parsed), "inserted": inserted},
    )

    await db.commit()

    return {"inserted": inserted, "skipped": skipped, "total_parsed": len(parsed)}
