from core.db import get_db
from datetime import datetime, date, timedelta


def get_ozet_rapor():
    """Özet kart verileri + son 7 günün günlük ciro/tahsilat."""
    db = get_db()

    # Bu ay ciro (satış fiyatları toplamı)
    bu_ay_ciro = db.execute(
        """
        SELECT COALESCE(SUM(satis_fiyati), 0) AS t
        FROM satislar
        WHERE strftime('%Y-%m', tarih) = strftime('%Y-%m', 'now', 'localtime')
        """
    ).fetchone()['t']

    # Bu ay tahsilat (peşinat + bu ayki ödemeler)
    bu_ay_pesinat = db.execute(
        """
        SELECT COALESCE(SUM(pesinat), 0) AS t
        FROM satislar
        WHERE strftime('%Y-%m', tarih) = strftime('%Y-%m', 'now', 'localtime')
        """
    ).fetchone()['t']

    bu_ay_odemeler = db.execute(
        """
        SELECT COALESCE(SUM(miktar), 0) AS t
        FROM odemeler
        WHERE strftime('%Y-%m', tarih) = strftime('%Y-%m', 'now', 'localtime')
        """
    ).fetchone()['t']

    bu_ay_tahsilat = float(bu_ay_pesinat or 0) + float(bu_ay_odemeler or 0)

    # Toplam bekleyen alacak (tüm zamanlar)
    toplam_satis = db.execute("SELECT COALESCE(SUM(satis_fiyati), 0) AS t FROM satislar").fetchone()['t']
    toplam_pesinat = db.execute("SELECT COALESCE(SUM(pesinat), 0) AS t FROM satislar").fetchone()['t']
    toplam_odemeler = db.execute("SELECT COALESCE(SUM(miktar), 0) AS t FROM odemeler").fetchone()['t']
    bekleyen_alacak = max(0, float(toplam_satis or 0) - float(toplam_pesinat or 0) - float(toplam_odemeler or 0))

    # En çok satan ürün (tüm zamanlar, adet bazında)
    en_cok = db.execute(
        """
        SELECT urun_ad, COUNT(*) AS adet
        FROM satislar
        WHERE urun_ad IS NOT NULL AND urun_ad != ''
        GROUP BY urun_ad
        ORDER BY adet DESC
        LIMIT 1
        """
    ).fetchone()
    en_cok_satan = {'ad': en_cok['urun_ad'], 'adet': en_cok['adet']} if en_cok else {'ad': '—', 'adet': 0}

    # Bu ayki satış adedi
    bu_ay_satis_adet = db.execute(
        """
        SELECT COUNT(*) AS c FROM satislar
        WHERE strftime('%Y-%m', tarih) = strftime('%Y-%m', 'now', 'localtime')
        """
    ).fetchone()['c']

    # Son 7 günün günlük verileri
    son_7_gun = []
    for i in range(6, -1, -1):
        gun = (date.today() - timedelta(days=i)).strftime('%Y-%m-%d')
        etiket = (date.today() - timedelta(days=i)).strftime('%d/%m')

        ciro = db.execute(
            "SELECT COALESCE(SUM(satis_fiyati), 0) AS t FROM satislar WHERE date(tarih) = ?",
            (gun,)
        ).fetchone()['t']

        pesinat = db.execute(
            "SELECT COALESCE(SUM(pesinat), 0) AS t FROM satislar WHERE date(tarih) = ?",
            (gun,)
        ).fetchone()['t']

        odeme = db.execute(
            "SELECT COALESCE(SUM(miktar), 0) AS t FROM odemeler WHERE date(tarih) = ?",
            (gun,)
        ).fetchone()['t']

        son_7_gun.append({
            'tarih': gun,
            'etiket': etiket,
            'ciro': float(ciro or 0),
            'tahsilat': float(pesinat or 0) + float(odeme or 0),
        })

    return {
        'bu_ay_ciro': float(bu_ay_ciro or 0),
        'bu_ay_tahsilat': bu_ay_tahsilat,
        'bekleyen_alacak': bekleyen_alacak,
        'en_cok_satan': en_cok_satan,
        'bu_ay_satis_adet': bu_ay_satis_adet,
        'son_7_gun': son_7_gun,
    }


def get_donemsel_rapor(baslangic, bitis):
    """
    Verilen tarih aralığı için satış + ödeme detayları.
    baslangic / bitis : 'YYYY-MM-DD' string
    """
    db = get_db()

    rows = db.execute(
        """
        SELECT
            s.id, s.musteri_ad, s.urun_ad,
            s.satis_fiyati, s.pesinat,
            s.tarih,
            COALESCE((SELECT SUM(o.miktar) FROM odemeler o WHERE o.satis_id = s.id), 0) AS sonraki_odemeler
        FROM satislar s
        WHERE date(s.tarih) BETWEEN ? AND ?
        ORDER BY s.tarih DESC, s.id DESC
        """,
        (baslangic, bitis)
    ).fetchall()

    satirlar = []
    toplam_ciro = 0
    toplam_tahsilat = 0
    toplam_kalan = 0

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

        toplam_ciro += fiyat
        toplam_tahsilat += odenen
        toplam_kalan += kalan

        satirlar.append({
            'id': r['id'],
            'tarih': r['tarih'],
            'musteri_ad': r['musteri_ad'],
            'urun_ad': r['urun_ad'],
            'satis_fiyati': fiyat,
            'pesinat': pesinat,
            'sonraki_odemeler': sonraki,
            'toplam_odened': odenen,
            'kalan': kalan,
            'kapali': kalan < 0.01,
        })

    return {
        'satirlar': satirlar,
        'ozet': {
            'toplam_ciro': toplam_ciro,
            'toplam_tahsilat': toplam_tahsilat,
            'toplam_kalan': toplam_kalan,
            'satis_adedi': len(satirlar),
        }
    }
