from core.db import get_db


def search_customers(q=""):
    db = get_db()

    sql = """
        SELECT id, ad_soyad, telefon, tc_no, olusturma_tarihi
        FROM musteriler
        WHERE 1=1
    """
    params = []

    if q:
        like = f"%{q}%"
        sql += " AND (ad_soyad LIKE ? OR COALESCE(telefon,'') LIKE ? OR COALESCE(tc_no,'') LIKE ?)"
        params.extend([like, like, like])

    sql += " ORDER BY ad_soyad LIMIT 50"

    rows = db.execute(sql, params).fetchall()
    return [dict(row) for row in rows]


def get_customer_detail(musteri_id):
    db = get_db()

    musteri = db.execute(
        "SELECT id, ad_soyad, telefon, tc_no, olusturma_tarihi FROM musteriler WHERE id = ?",
        (musteri_id,)
    ).fetchone()

    if not musteri:
        return None

    satislar = db.execute(
        """
        SELECT
            s.id, s.urun_ad, s.satis_fiyati, s.pesinat, s.notlar, s.tarih,
            COALESCE(s.kaynak, 'normal') AS kaynak,
            COALESCE((SELECT SUM(o.miktar) FROM odemeler o WHERE o.satis_id = s.id), 0) AS sonraki_odemeler
        FROM satislar s
        WHERE s.musteri_id = ?
        ORDER BY s.tarih DESC, s.id DESC
        """,
        (musteri_id,)
    ).fetchall()

    toplam_satis = sum(float(s["satis_fiyati"] or 0) for s in satislar)
    toplam_pesinat = sum(float(s["pesinat"] or 0) + float(s["sonraki_odemeler"] or 0) for s in satislar)
    toplam_kalan = sum(max(0, float(s["satis_fiyati"] or 0) - float(s["pesinat"] or 0) - float(s["sonraki_odemeler"] or 0)) for s in satislar)

    return {
        "musteri": dict(musteri),
        "satislar": [{
            "id": s["id"],
            "urun_ad": s["urun_ad"],
            "satis_fiyati": float(s["satis_fiyati"] or 0),
            "pesinat": float(s["pesinat"] or 0) + float(s["sonraki_odemeler"] or 0),
            "kalan": max(0, float(s["satis_fiyati"] or 0) - float(s["pesinat"] or 0) - float(s["sonraki_odemeler"] or 0)),
            "notlar": s["notlar"],
            "tarih": s["tarih"],
            "kaynak": s["kaynak"]
        } for s in satislar],
        "ozet": {
            "toplam_satis": toplam_satis,
            "toplam_pesinat": toplam_pesinat,
            "toplam_kalan": toplam_kalan,
            "adet": len(satislar)
        }
    }


def create_customer(data):
    db = get_db()

    ad_soyad = (data.get("ad_soyad") or "").strip()
    telefon = (data.get("telefon") or "").strip()
    tc_no = (data.get("tc_no") or "").strip()

    if not ad_soyad:
        return {"ok": False, "hata": "Müşteri adı zorunlu"}

    existing = db.execute(
        "SELECT id, ad_soyad, telefon, tc_no FROM musteriler WHERE lower(ad_soyad)=lower(?) LIMIT 1",
        (ad_soyad,)
    ).fetchone()

    if existing:
        return {
            "ok": True,
            "id": existing["id"],
            "ad_soyad": existing["ad_soyad"],
            "telefon": existing["telefon"] or "",
            "tc_no": existing["tc_no"] or ""
        }

    cursor = db.execute(
        "INSERT INTO musteriler (ad_soyad, telefon, tc_no) VALUES (?, ?, ?)",
        (ad_soyad, telefon, tc_no)
    )
    db.commit()

    return {
        "ok": True,
        "id": cursor.lastrowid,
        "ad_soyad": ad_soyad,
        "telefon": telefon,
        "tc_no": tc_no
    }
