from core.db import get_db
from datetime import datetime


def create_sale(data):
    db = get_db()

    musteri_id = data.get("musteri_id")
    musteri_ad = (data.get("musteri_ad") or "").strip()
    urun_id = data.get("urun_id")
    urun_ad = (data.get("urun_ad") or "").strip()
    satis_fiyati = _to_float(data.get("satis_fiyati"))
    pesinat = _to_float(data.get("pesinat"))
    notlar = (data.get("notlar") or "").strip()
    tarih = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    if not musteri_ad:
        return {"ok": False, "hata": "Müşteri gerekli"}

    if not urun_id:
        return {"ok": False, "hata": "Ürün gerekli"}

    if satis_fiyati is None or satis_fiyati <= 0:
        return {"ok": False, "hata": "Satış fiyatı hatalı"}

    if pesinat is None or pesinat < 0:
        return {"ok": False, "hata": "Peşinat hatalı"}

    if pesinat > satis_fiyati:
        return {"ok": False, "hata": "Peşinat satış fiyatını geçemez"}

    product = db.execute(
        "SELECT id, ad, stok FROM urunler WHERE id = ?",
        (urun_id,)
    ).fetchone()

    if not product:
        return {"ok": False, "hata": "Ürün bulunamadı"}

    if int(product["stok"] or 0) <= 0:
        return {"ok": False, "hata": "Bu ürün stokta yok"}

    kalan = satis_fiyati - pesinat

    db.execute(
        """
        INSERT INTO satislar (
            musteri_id, musteri_ad, urun_id, urun_ad,
            satis_fiyati, pesinat, kalan, notlar, tarih, kaynak
        )
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'normal')
        """,
        (
            musteri_id if musteri_id not in ("", None) else None,
            musteri_ad,
            urun_id,
            urun_ad or product["ad"],
            satis_fiyati,
            pesinat,
            kalan,
            notlar,
            tarih
        )
    )

    db.execute(
        "UPDATE urunler SET stok = CASE WHEN stok > 0 THEN stok - 1 ELSE 0 END WHERE id = ?",
        (urun_id,)
    )

    db.execute(
        """
        INSERT INTO stok_hareketleri (
            urun_id, urun_ad, hareket_turu, miktar, birim_maliyet, aciklama
        )
        VALUES (?, ?, ?, ?, ?, ?)
        """,
        (
            urun_id,
            urun_ad or product["ad"],
            "Stok Cikisi",
            1,
            0,
            f"Satış kaydı oluşturuldu - {musteri_ad}"
        )
    )

    db.commit()
    return {"ok": True}


def create_gecmis_sale(data):
    """Geçmiş işlem — depodan ürün çekilmez, stok düşmez, tarih manuel."""
    db = get_db()

    musteri_ad = (data.get("musteri_ad") or "").strip()
    musteri_telefon = (data.get("musteri_telefon") or "").strip()
    musteri_tc = (data.get("musteri_tc") or "").strip()
    urun_ad = (data.get("urun_ad") or "").strip()
    satis_fiyati = _to_float(data.get("satis_fiyati"))
    pesinat = _to_float(data.get("pesinat"))
    notlar = (data.get("notlar") or "").strip()
    tarih_str = (data.get("tarih") or "").strip()

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

    if not urun_ad:
        return {"ok": False, "hata": "Ürün adı gerekli"}

    if satis_fiyati is None or satis_fiyati <= 0:
        return {"ok": False, "hata": "Satış fiyatı hatalı"}

    if pesinat is None or pesinat < 0:
        return {"ok": False, "hata": "Peşinat hatalı"}

    if pesinat > satis_fiyati:
        return {"ok": False, "hata": "Peşinat satış fiyatını geçemez"}

    # Tarihi doğrula / fallback bugün
    try:
        tarih = datetime.strptime(tarih_str, "%Y-%m-%d").strftime("%Y-%m-%d %H:%M:%S")
    except ValueError:
        tarih = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    # Müşteriyi yeni kayıt et
    musteri_id = None
    try:
        cur = db.execute(
            "INSERT INTO musteriler (ad_soyad, telefon, tc_no) VALUES (?, ?, ?)",
            (musteri_ad, musteri_telefon or None, musteri_tc or None)
        )
        musteri_id = cur.lastrowid
    except Exception:
        pass

    kalan = satis_fiyati - pesinat

    db.execute(
        """
        INSERT INTO satislar (
            musteri_id, musteri_ad, urun_id, urun_ad,
            satis_fiyati, pesinat, kalan, notlar, tarih, kaynak
        )
        VALUES (?, ?, NULL, ?, ?, ?, ?, ?, ?, 'gecmis')
        """,
        (
            musteri_id,
            musteri_ad,
            urun_ad,
            satis_fiyati,
            pesinat,
            kalan,
            notlar,
            tarih
        )
    )

    db.commit()
    return {"ok": True}


def list_sales(q=None, tarih=None, durum=None):
    """
    q     : arama (musteri_ad veya urun_ad)
    tarih : 'bugun' | 'hafta' | 'ay' | None (tümü)
    durum : 'borclu' | 'kapali' | None (tümü)
    """
    db = get_db()

    sql = """
        SELECT
            s.id, s.musteri_id, s.musteri_ad, s.urun_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 1=1
    """
    params = []

    if q:
        like = f"%{q}%"
        sql += " AND (s.musteri_ad LIKE ? OR s.urun_ad LIKE ?)"
        params.extend([like, like])

    if tarih == 'bugun':
        sql += " AND date(s.tarih) = date('now','localtime')"
    elif tarih == 'hafta':
        sql += " AND s.tarih >= datetime('now','-7 days','localtime')"
    elif tarih == 'ay':
        sql += " AND s.tarih >= datetime('now','-30 days','localtime')"

    sql += " ORDER BY s.tarih DESC, s.id DESC LIMIT 200"

    rows = db.execute(sql, params).fetchall()

    result = []
    for r in rows:
        toplam_odenen = float(r['pesinat'] or 0) + float(r['sonraki_odemeler'] or 0)
        kalan = max(0, float(r['satis_fiyati'] or 0) - toplam_odenen)

        if durum == 'borclu' and kalan <= 0.009:
            continue
        if durum == 'kapali' and kalan > 0.009:
            continue

        result.append({
            'id': r['id'],
            'musteri_id': r['musteri_id'],
            'musteri_ad': r['musteri_ad'],
            'urun_id': r['urun_id'],
            'urun_ad': r['urun_ad'],
            'satis_fiyati': float(r['satis_fiyati'] or 0),
            'pesinat': float(r['pesinat'] or 0),
            'toplam_odenen': toplam_odenen,
            'kalan': kalan,
            'notlar': r['notlar'],
            'tarih': r['tarih'],
            'kaynak': r['kaynak'],
        })

    return result


def _to_float(value):
    if value in (None, ""):
        return 0.0
    try:
        return float(value)
    except (TypeError, ValueError):
        return None
