"""
Excel'i (veriler.xlsx) sisteme yuklenebilir JSON formatina cevirir.
Lokal calistir: python excel_to_json.py
Cikti: veriler.json
"""
import sys, io, json, re, unicodedata
from datetime import datetime, date

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

import openpyxl
wb = openpyxl.load_workbook('veriler.xlsx', data_only=True)

def temizle(v):
    if v is None: return None
    if isinstance(v, (datetime, date)):
        return v.strftime('%Y-%m-%d')
    if isinstance(v, str):
        v = v.strip()
        return v if v else None
    return v

def num(v):
    if v is None or v == '': return 0
    try: return float(v)
    except: return 0

def int_or_none(v):
    if v is None or v == '': return None
    try: return int(v)
    except: return None


# ============ LISTELER (Kategoriler + Hareket Turleri) ============
s = wb['Listeler']
cari_turleri = []   # A sutunu: Musteri, Tedarikci, ...
hareket_turleri = []  # B/C/E sutunlari: ad, yon, aciklama

# Renk haritasi cari kategorileri icin
RENK_MAP = {
    'müşteri': '#3b82f6', 'tedarikçi': '#f59e0b', 'müşteri/tedarikçi': '#a855f7',
    'personel': '#10b981', 'diğer': '#94a3b8',
}

for i, row in enumerate(s.iter_rows(values_only=True), start=1):
    if i < 5: continue  # başlık 3, başlık satırı 4, veriler 5+ ama indeks 5'den itibaren
    ad_a = temizle(row[0])
    if ad_a:
        renk = RENK_MAP.get(ad_a.lower(), '#64748b')
        cari_turleri.append({'ad': ad_a, 'renk': renk})

    # Hareket türü: B=ad, C=yön, E=aciklama
    tur_ad = temizle(row[1])
    yon = temizle(row[2])
    aciklama = temizle(row[4])
    if tur_ad and yon:
        # Sistem 'Borc' veya 'Alacak' ister
        yon_norm = 'Borc' if yon.upper() == 'B' else ('Alacak' if yon.upper() == 'A' else None)
        if yon_norm:
            hareket_turleri.append({
                'ad': tur_ad,
                'yon': yon_norm,
                'aciklama': aciklama,
            })


# ============ CARI KARTLARI ============
s = wb['Cari Kartları']
cariler = []
for i, row in enumerate(s.iter_rows(values_only=True), start=1):
    if i < 4: continue  # başlık 3, veriler 4+
    kod = temizle(row[0])
    unvan = temizle(row[1])
    if not kod or not unvan: continue
    cariler.append({
        'cari_kodu':     kod,
        'unvan':         unvan,
        'kategori_ad':   temizle(row[2]),
        'vergi_dairesi': temizle(row[3]),
        'vergi_no':      str(temizle(row[4]) or '') or None,
        'telefon':       temizle(row[5]),
        'email':         temizle(row[6]),
        'adres':         temizle(row[7]),
    })


# ============ KASA-BANKA ============
s = wb['Kasa-Banka']
kasalar = []
for i, row in enumerate(s.iter_rows(values_only=True), start=1):
    if i < 6: continue  # başlık 5, veriler 6+
    ad = temizle(row[0])
    if not ad: continue
    acilis = num(row[1])
    # Tip tespiti: ad 'Banka' icerirse Banka, yoksa Kasa
    tip = 'Banka' if 'banka' in ad.lower() else 'Kasa'
    kasalar.append({
        'ad':              ad,
        'tip':             tip,
        'para_birimi':     'TRY',
        'acilis_bakiyesi': acilis,
    })


# ============ HAREKETLER ============
s = wb['Hareketler']
hareketler = []
ATLANAN = {'sayi': 0, 'sebep': {}}
def atla(sebep):
    ATLANAN['sayi'] += 1
    ATLANAN['sebep'][sebep] = ATLANAN['sebep'].get(sebep, 0) + 1

for i, row in enumerate(s.iter_rows(values_only=True), start=1):
    if i < 8: continue  # başlık 7, veriler 8+
    sira = int_or_none(row[0])
    if not sira: continue
    tarih = temizle(row[1])
    cari_kodu = temizle(row[3])
    tur_ad = temizle(row[5])
    belge_no = temizle(row[6])
    aciklama = temizle(row[7])
    borc = num(row[10])
    alacak = num(row[11])
    kasa_ad = temizle(row[12])

    if not tarih:
        atla('tarih_yok'); continue
    if not tur_ad:
        atla('tur_yok'); continue

    # Kasa bos ise tipinden cikar (Excel data validation cached value bos kalmis)
    if not kasa_ad:
        tl = tur_ad.lower()
        if '(banka)' in tl: kasa_ad = 'Banka - Garanti BBVA'
        else: kasa_ad = 'Merkez Kasa'

    # Tutar: borc veya alacak — hangisi 0 değilse o
    tutar = borc if borc > 0 else alacak
    if tutar <= 0:
        atla('tutar_sifir'); continue

    hareketler.append({
        'tarih':       tarih,
        'cari_kodu':   cari_kodu,
        'tur_ad':      tur_ad,
        'kasa_ad':     kasa_ad,
        'tutar':       tutar,
        'belge_no':    str(belge_no) if belge_no is not None else None,
        'aciklama':    aciklama,
    })


# ============ YAZ ============
veri = {
    'cari_turleri':    cari_turleri,
    'hareket_turleri': hareket_turleri,
    'cariler':         cariler,
    'kasalar':         kasalar,
    'hareketler':      hareketler,
    'ozet': {
        'cari_turleri':    len(cari_turleri),
        'hareket_turleri': len(hareket_turleri),
        'cariler':         len(cariler),
        'kasalar':         len(kasalar),
        'hareketler':      len(hareketler),
        'atlanan_hareket': ATLANAN,
    },
}

with open('veriler.json', 'w', encoding='utf-8') as f:
    json.dump(veri, f, ensure_ascii=False, indent=2)

print(json.dumps(veri['ozet'], ensure_ascii=False, indent=2))
print(f"\nveriler.json yazildi.")
