"""Hata bulma testinin GİZLİ testleri (modele verilmez). Her test bir hatayı yakalar; 9 hata = 9 test.
    python3 gizli_test.py <proje klasörü>      # ör. ~/argon-k/hata/argon
"""
import sys, unittest
from datetime import date
sys.path.insert(0, sys.argv.pop(1) if len(sys.argv) > 1 else "kaynak")
from sepet import Sepet, Urun, Kupon, kurus_yuvarla, siparis_tarihi_yaz, ortalama_puan  # noqa: E402
try:
    from sepet.sepet import StokYetersiz
except ImportError:
    StokYetersiz = Exception


def urun(kod="A", fiyat=10000, kat="elektronik", stok=10):
    return Urun(kod, kod, fiyat, kat, stok=stok)


class Hatalar(unittest.TestCase):
    def test_1_kupon_son_gun_dahil(self):
        self.assertTrue(Kupon("K", 10, date(2026, 10, 14)).gecerli_mi(date(2026, 10, 14)))
        self.assertFalse(Kupon("K", 10, date(2026, 10, 14)).gecerli_mi(date(2026, 10, 15)))

    def test_2_bilinmeyen_kategori_kdv_20(self):
        s = Sepet(); s.ekle(urun(kat="oyuncak", fiyat=10000), 1)
        self.assertEqual(s.kdv(), 2000)

    def test_3_kurus_yuvarlama_yarim_yukari(self):
        self.assertEqual(kurus_yuvarla(12.345), 1235)
        self.assertEqual(kurus_yuvarla(19.999), 2000)
        self.assertEqual(kurus_yuvarla(0.005), 1)

    def test_4_tarih_gg_aa_yyyy(self):
        self.assertEqual(siparis_tarihi_yaz(date(2026, 3, 9)), "09.03.2026")

    def test_5_bos_puan_listesi_sifir(self):
        self.assertEqual(ortalama_puan([]), 0)
        self.assertEqual(ortalama_puan([4, 5, 5]), 4.7)

    def test_6_stok_kadar_eklenebilir(self):
        s = Sepet(); s.ekle(urun(stok=5), 5)
        self.assertEqual(sum(a for _, a in s.satirlar), 5)
        with self.assertRaises(StokYetersiz):
            Sepet().ekle(urun(stok=5), 6)

    def test_7_cikar_butun_satirlari_siler(self):
        s = Sepet(); u = urun(stok=10)
        s.ekle(u, 1); s.ekle(u, 1); s.ekle(urun("B"), 1)
        s.cikar("A")
        self.assertEqual([x.kod for x, _ in s.satirlar], ["B"])

    def test_8_kargo_500_tl_dahil_ucretsiz(self):
        s = Sepet(); s.ekle(urun(fiyat=41667, stok=3), 1)   # 416,67 + %20 KDV (83,33) = tam 500,00 TL
        self.assertEqual(s.toplam(), 50000)

    def test_9_indirim_bir_kez(self):
        s = Sepet(); s.ekle(urun(fiyat=100000, kat="elektronik"), 1)
        s.kupon_uygula(Kupon("Y", 10, date(2030, 1, 1)), date(2026, 10, 14))
        self.assertEqual(s.toplam(), 90000 + 18000)       # 1000 TL -%10 = 900, +%20 KDV = 1080, kargo yok


if __name__ == "__main__":
    unittest.main(verbosity=2)
