from core.db import get_db
from datetime import datetime


def get_customer_sales(musteri_id):
    """Müşterinin satışları + her satışa ait ödemeler."""
    db = get_db()

    satislar = db.execute(
        """
        SELECT id, urun_ad, satis_fiyati, pesinat AS ilk_pesinat, notlar, tarih,
               COALESCE(kaynak, 'normal') AS kaynak
        FROM satislar
        WHERE musteri_id = ?
        ORDER BY tarih DESC, id DESC
        """,
        (musteri_id,)
    ).fetchall()

    result = []
    for s in satislar:
        sid = s["id"]

        odemeler = db.execute(
            "SELECT id, miktar, notlar, tarih FROM odemeler WHERE satis_id = ? ORDER BY tarih ASC",
            (sid,)
        ).fetchall()

        toplam_odenen = float(s["ilk_pesinat"] or 0) + sum(float(o["miktar"]) for o in odemeler)
        kalan = max(0, float(s["satis_fiyati"] or 0) - toplam_odenen)

        result.append({
            "id": sid,
            "urun_ad": s["urun_ad"],
            "satis_fiyati": float(s["satis_fiyati"] or 0),
            "ilk_pesinat": float(s["ilk_pesinat"] or 0),
            "toplam_odenen": toplam_odenen,
            "kalan": kalan,
            "notlar": s["notlar"],
            "tarih": s["tarih"],
            "kaynak": s["kaynak"],
            "odemeler": [dict(o) for o in odemeler]
        })

    return result


def add_payment(satis_id, miktar, notlar=""):
    db = get_db()

    satis = db.execute(
        "SELECT id, satis_fiyati, pesinat FROM satislar WHERE id = ?",
        (satis_id,)
    ).fetchone()

    if not satis:
        return {"ok": False, "hata": "Satış bulunamadı"}

    if miktar <= 0:
        return {"ok": False, "hata": "Miktar 0'dan büyük olmalı"}

    # Mevcut toplam ödenen
    odeme_toplam = db.execute(
        "SELECT COALESCE(SUM(miktar), 0) AS toplam FROM odemeler WHERE satis_id = ?",
        (satis_id,)
    ).fetchone()["toplam"]

    toplam_odenen = float(satis["pesinat"] or 0) + float(odeme_toplam or 0)
    kalan = float(satis["satis_fiyati"] or 0) - toplam_odenen

    if miktar > kalan + 0.01:
        return {"ok": False, "hata": f"Ödeme kalanı ({fmt(kalan)}₺) aşıyor"}

    tarih = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    db.execute(
        "INSERT INTO odemeler (satis_id, miktar, notlar, tarih) VALUES (?, ?, ?, ?)",
        (satis_id, miktar, notlar.strip() if notlar else None, tarih)
    )
    db.commit()

    yeni_kalan = max(0, kalan - miktar)
    return {"ok": True, "kalan": yeni_kalan}


def fmt(val):
    return f"{float(val or 0):,.2f}".replace(",", ".")
