# -*- coding: utf-8 -*-
"""
TRENDYOL KARGO TABLOSU  ->  desi basina EN UCUZ firma

Kaynak: guncel_kargo_fiyatlari-20260810-tr.pdf (10 Agustos 2026)
Kullanici 7 Eyl 2026: "Aras DHL eCommerce Kolay Gelsin PTT Surat
Yurtici bu firmalardan en ucuz olanini bul onun uzerinden
hesaplamalari yapacak sekilde"

--------------------------------------------------------------------
PDF'TEN OLCULEN UC KRITIK NOKTA

1) FIYATLAR KDV HARIC. PDF: "Paylasilan kargo fiyatlari ve ek
   bedellerde %20 KDV haricdir." -> hepsi 1,20 ile carpiliyor.

2) 100 DESI VE USTU ICIN "AGIR KARGO TASIMA" EK UCRETI VAR:
       Aras 4.250 · DHL 7.154,99 · Surat 4.500 · Yurtici 5.350
   Kolay Gelsin ve PTT'de bu satir "-" yani ek ucret YOK.
   Bu ek ucreti saymamak 131 kilo bir mukavva paketinde 5.100 TL
   eksik hesap demekti.

3) 100 DESI USTUNDE PTT VE TEX TABLODAN CIKIYOR. Desi 0-100
   satirlari 10 kolon, 101-500 satirlari 8 kolon; 100->101
   gecisinde Aras 1195,97 -> 1207,75 ve Kolay Gelsin 1143,44 ->
   1153,94 suruyor, yani eksilen iki kolon PTT ve TEX.
   Dolayisiyla desi 100 uzerinde PTT secilemez.

Sonuc: agir kalemlerde Kolay Gelsin acik ara en ucuz - ek ucreti
olmadigi icin desi 100'de 1.143 TL, Aras ise 1.196 + 4.250 TL.

    python kargo_tablo.py
"""
import io, re, json, os

KAYNAK = r'C:\Users\Mikro Pc\Desktop\TBM-kayitlar\veri\kargo_pdf.txt'
CIKTI  = r'C:\Users\Mikro Pc\Desktop\TBM-kayitlar\veri\ty_kargo_min.json'

KDV = 1.20
# kullanicinin saydigi alti firma (TEX, CEVA, Horoz haric)
SECILI = ['Aras', 'DHL eCommerce', 'Kolay Gelsin', 'PTT', 'Sürat', 'Yurtiçi']

#  KULLANILAN KARGO FIRMASI  -  29 Eyl 2026
#
#  Kullanici: "biz trendyolda surat kargoyu kullaniyoruz, trendyolun
#  surat kargo fiyatlarini kullanarak o desileri de o fiyatlara gore
#  guncelle".
#
#  Onceki kurulum her desi icin EN UCUZ firmayi seciyordu (Kolay Gelsin
#  442, Aras 41, PTT 18 desi). Ama gonderiyi o firma degil SURAT tasiyor;
#  en ucuzun fiyatiyla hesaplamak maliyeti OLDUGUNDAN DUSUK gosterir ve
#  aradaki fark her gonderide cepten cikar.
#
#  None yapilirsa eski davranisa (desi basina en ucuz firma) doner.
FIRMA_ZORLA = 'Sürat'

# 100 desi ve ustu ek ucret (KDV haric). '-' olanlar 0.
AGIR = {'Aras': 4250.0, 'DHL eCommerce': 7154.99, 'Sürat': 4500.0,
        'Yurtiçi': 5350.0, 'Kolay Gelsin': 0.0, 'PTT': 0.0}
AGIR_ESIK = 100

KOL10 = ['Aras','DHL eCommerce','Kolay Gelsin','PTT','Sürat','TEX','Yurtiçi',
         'CEVA Tedarik','CEVA','Horoz']
KOL8  = ['Aras','DHL eCommerce','Kolay Gelsin','Sürat','Yurtiçi',
         'CEVA Tedarik','CEVA','Horoz']

def main():
    t = io.open(KAYNAK, encoding='utf-8').read()
    ham = {}
    for m in re.finditer(r'^(\d+)((?:\s+\d+\.\d+)+)\s*$', t, re.M):
        d = int(m.group(1))
        v = [float(x) for x in m.group(2).split()]
        if len(v) == 10:   kol = KOL10
        elif len(v) == 8:  kol = KOL8
        else:              continue
        ham[d] = dict(zip(kol, v))

    tablo = {}
    kazanan = {}
    eksik = []          # zorlanan firmanin fiyati olmayan desiler
    enUcuzFark = []     # (desi, surat_tl, enucuz_tl, enucuz_firma)
    for d in sorted(ham):
        adaylar = []
        for f in SECILI:
            if f not in ham[d]:
                continue          # desi > 100'de PTT yok
            fiyat = ham[d][f]
            if d >= AGIR_ESIK:
                fiyat += AGIR.get(f, 0.0)
            adaylar.append((fiyat, f))
        if not adaylar: continue
        adaylar.sort()

        if FIRMA_ZORLA is None:
            en, firma = adaylar[0]
        else:
            zorlanan = [(p, f) for p, f in adaylar if f == FIRMA_ZORLA]
            if not zorlanan:
                #  Firmanin o deside fiyati yok - SESSIZCE en ucuza
                #  dusmuyoruz, cunku o zaman tablo karisik olur ve
                #  hangi satirin hangi firmadan geldigi belli olmaz.
                eksik.append(d)
                continue
            en, firma = zorlanan[0]
            ucuzFiyat, ucuzFirma = adaylar[0]
            if ucuzFirma != FIRMA_ZORLA:
                enUcuzFark.append((d, en * KDV, ucuzFiyat * KDV, ucuzFirma))

        tablo[d] = {'kdvsiz': round(en, 2),
                    'tl': round(en * KDV, 2),
                    'firma': firma}
        kazanan[firma] = kazanan.get(firma, 0) + 1

    json.dump({'tablo': tablo, 'kdv': KDV, 'secili': SECILI,
               'firma_zorla': FIRMA_ZORLA,
               'agir_esik': AGIR_ESIK, 'agir': AGIR},
              io.open(CIKTI, 'w', encoding='utf-8'), ensure_ascii=False)

    if FIRMA_ZORLA is None:
        print('=== DESI BASINA EN UCUZ FIRMA (alti firma, KDV ve agir kargo dahil) ===')
    else:
        print('=== KULLANILAN FIRMA: %s  (KDV ve agir kargo dahil) ===' % FIRMA_ZORLA)
    for f, n in sorted(kazanan.items(), key=lambda x: -x[1]):
        print('  %-16s %4d desi satiri' % (f, n))
    if eksik:
        print('  UYARI - fiyati olmayan desi: %d adet %s' % (len(eksik), eksik[:12]))

    print('\n=== ORNEK DESILER ===')
    print('  %-6s %12s %12s  %s' % ('DESI', 'KDVSIZ', 'KDV DAHIL', 'FIRMA'))
    for d in (0, 1, 3, 5, 10, 20, 25, 30, 40, 50, 70, 99, 100, 110, 131, 200, 300, 500):
        if d not in tablo: continue
        x = tablo[d]
        print('  %-6d %12s %12s  %s' % (d,
            format(x['kdvsiz'], ',.2f'), format(x['tl'], ',.2f'), x['firma']))

    #  Zorlanan firma en ucuz degilse aradaki fark: fiyatlara BU kadar
    #  daha fazla kargo yansiyacak. Gormeden gecilmemeli.
    if enUcuzFark:
        toplamFark = sum(a - b for _, a, b, _ in enUcuzFark)
        print('\n=== %s EN UCUZ OLMADIGI DESILER: %d / %d ==='
              % (FIRMA_ZORLA, len(enUcuzFark), len(tablo)))
        print('  ortalama fark %s TL  ·  en buyuk fark %s TL'
              % (format(toplamFark / len(enUcuzFark), ',.2f'),
                 format(max(a - b for _, a, b, _ in enUcuzFark), ',.2f')))
        print('  %-6s %12s %12s  %s' % ('DESI', FIRMA_ZORLA, 'EN UCUZ', 'FIRMA'))
        for d, a, b, f in enUcuzFark[:6]:
            print('  %-6d %12s %12s  %s' % (d, format(a, ',.2f'), format(b, ',.2f'), f))

    print('\n  desi araligi: %d - %d   (%d satir)' % (min(tablo), max(tablo), len(tablo)))
    print('  Cikti: %s' % CIKTI)

if __name__ == '__main__':
    main()
