import os
import datetime
import csv
from io import StringIO
from functools import wraps
from flask import Flask, render_template, request, redirect, url_for, session, flash, make_response, send_from_directory
from werkzeug.utils import secure_filename
from models import db, Admin, Sporcu, Olcum, Evrak, Odeme, Gider, Belge

app = Flask(__name__)

# Güvenlik ve Gizli Anahtar Ayarları
app.secret_key = os.environ.get("SECRET_KEY", "arckhe_spor_kulubu_2026_secur3_k3y_#987")
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///arckhe_spor.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# --- DOSYA YÜKLEME KLASÖRÜ AYARLARI ---
UPLOAD_FOLDER = os.path.join('static', 'uploads')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# Klasörler yoksa otomatik oluştur
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(os.path.join('static', 'avatars'), exist_ok=True)

# --- VERİTABANINI UYGULAMAYA BAĞLAMA ---
db.init_app(app)

# --- YARDIMCI DÖNÜŞTÜRÜCÜ FONKSİYONLAR ---
def safe_float(val):
    """Gelen verideki virgülleri noktaya çevirerek güvenli float (küsuratlı sayı) yapısını sağlar."""
    if not val:
        return None
    try:
        return float(str(val).replace(',', '.').strip())
    except ValueError:
        return None

def safe_int(val):
    """Sayısal girdileri güvenli integer (tamsayı) yapar."""
    if not val:
        return None
    try:
        return int(str(val).strip())
    except ValueError:
        return None

def format_tarih_tr(tarih_str):
    """YYYY-MM-DD formatında gelen tarihi GG.AA.YYYY formatına çevirir."""
    if not tarih_str:
        return ""
    try:
        parcalar = tarih_str.split('-')
        if len(parcalar) == 3:
            return f"{parcalar[2]}.{parcalar[1]}.{parcalar[0]}"
    except Exception:
        pass
    return tarih_str

def sporcu_durumunu_guncelle_ve_getir(sporcu):
    """
    Sporcunun durumunu, yapılan ödemelerdeki 'aylar' metnine göre kontrol eder ve belirler.
    """
    bugun = datetime.date.today()
    
    # Türkçe ay isimleri listesi (Örn: "Ocak 2026")
    ay_isimleri = [
        "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", 
        "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"
    ]
    simdiki_ay_str = f"{ay_isimleri[bugun.month - 1]} {bugun.year}"
    
    # Sporcuya ait tüm ödeme kayıtlarını çekiyoruz
    odemeler = Odeme.query.filter_by(sporcu_id=sporcu.id).all()
    
    # Ödenen tüm ayları tek bir listede topluyoruz
    odenmis_aylar = []
    for odeme in odemeler:
        if odeme.aylar:
            # Virgülle ayrılmış ayları ayırıp listeye ekliyoruz (örn: "Ocak 2026, Şubat 2026")
            ay_listesi = [a.strip() for a in odeme.aylar.split(',')]
            odenmis_aylar.extend(ay_listesi)
            
    # Eğer içinde bulunduğumuz ay ödenmiş aylar listesindeyse "Aktif"
    if simdiki_ay_str in odenmis_aylar:
        return "Aktif"
    else:
        # Ödenmemişse beklemede veya pasif döndürebilirsiniz
        return "Beklemede"

# --- YETKİ KONTROL DEKORATÖRLERİ ---
def admin_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not session.get('admin_logged_in'):
            flash("Bu sayfaya erişmek için yönetici girişi yapmalısınız.", "danger")
            return redirect(url_for('sporcu_giris')) # Artık ortak giriş ekranına yönlendiriyoruz
        return f(*args, **kwargs)
    return decorated_function

def sporcu_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not session.get('sporcu_id'):
            flash("Lütfen önce giriş yapın.", "warning")
            return redirect(url_for('sporcu_giris'))
        return f(*args, **kwargs)
    return decorated_function

# Veritabanını ve Varsayılan Yöneticiyi Oluşturma
with app.app_context():
    db.create_all()
    if not Admin.query.filter_by(kullanici_adi="arckhe").first():
        varsayilan_admin = Admin(kullanici_adi="arckhe")
        varsayilan_admin.set_sifre("GozdemHandem.19")
        db.session.add(varsayilan_admin)
        db.session.commit()

# YENİ EKLEMEK İSTEDİĞİNİZ ADMİN
    if not Admin.query.filter_by(kullanici_adi="Basak").first():
        yeni_admin = Admin(kullanici_adi="Basak")
        yeni_admin.set_sifre("AsrinAsya2015")  # Kendi belirleyeceğiniz şifre
        db.session.add(yeni_admin)
        db.session.commit()

        # YENİ EKLEMEK İSTEDİĞİNİZ ADMİN
    if not Admin.query.filter_by(kullanici_adi="Sule").first():
        yeni_admin = Admin(kullanici_adi="Sule")
        yeni_admin.set_sifre("Sezginer2026")  # Kendi belirleyeceğiniz şifre
        db.session.add(yeni_admin)
        db.session.commit()


# --- PUBLIC ROTALAR ---
@app.route('/')
def index():
    sporcular = Sporcu.query.all()
    tum_veriler = []
    dogum_yillari_set = set()
    
    for s in sporcular:
        dogum_yili = None
        if s.dogum_tarihi:
            try:
                parcalar = s.dogum_tarihi.split('.')
                if len(parcalar) == 3:
                    dogum_yili = int(parcalar[2])
            except Exception:
                pass
                
        if dogum_yili:
            dogum_yillari_set.add(dogum_yili)
            
        olcumler = Olcum.query.filter_by(sporcu_id=s.id).all()
        if olcumler:
            en_iyi_sicrama = 0
            en_iyi_smac = 0
            en_iyi_sinav = 0
            en_iyi_mekik = 0
            
            for o in olcumler:
                if o.smac_yuksekligi and o.el_yuksekligi:
                    sicrama = o.smac_yuksekligi - o.el_yuksekligi
                    if sicrama > en_iyi_sicrama:
                        en_iyi_sicrama = sicrama
                
                if o.smac_yuksekligi and o.smac_yuksekligi > en_iyi_smac:
                    en_iyi_smac = o.smac_yuksekligi
                if o.sinav and o.sinav > en_iyi_sinav:
                    en_iyi_sinav = o.sinav
                if o.mekik and o.mekik > en_iyi_mekik:
                    en_iyi_mekik = o.mekik
            
            tum_veriler.append({
                'sporcu': s,
                'dogum_yili': dogum_yili,
                'sicrama': round(en_iyi_sicrama, 1) if en_iyi_sicrama > 0 else 0,
                'smac': en_iyi_smac,
                'sinav': en_iyi_sinav,
                'mekik': en_iyi_mekik
            })
            
    dogum_yillari = sorted(list(dogum_yillari_set))
    
    return render_template('index.html', 
                           tum_veriler=tum_veriler, 
                           dogum_yillari=dogum_yillari)

@app.route('/lisans-evraklari')
def lisans_evraklari():
    evraklar = Evrak.query.order_by(Evrak.yukleme_tarihi.desc()).all()
    return render_template('lisans_evraklari.html', evraklar=evraklar)

# --- YÖNETİCİ ROTALARI ---
@app.route('/admin/giris', methods=['GET', 'POST'])
def admin_giris():
    # Eski admin giriş sayfasını doğrudan ortak giriş sayfasına yönlendirebiliriz
    return redirect(url_for('sporcu_giris'))

@app.route('/admin/cikis')
def admin_cikis():
    session.pop('admin_logged_in', None)
    session.pop('admin_kullanici_adi', None)
    return redirect(url_for('sporcu_giris'))

@app.route('/admin/sifre-degistir', methods=['GET', 'POST'])
@admin_required
def admin_sifre_degistir():
    admin_kadi = session.get('admin_kullanici_adi')
    admin = Admin.query.filter_by(kullanici_adi=admin_kadi).first()
    
    if request.method == 'POST':
        eski_sifre = request.form.get('eski_sifre', '').strip()
        yeni_sifre = request.form.get('yeni_sifre', '').strip()
        yeni_sifre_tekrar = request.form.get('yeni_sifre_tekrar', '').strip()
        
        if not admin.check_sifre(eski_sifre):
            flash("Mevcut şifrenizi hatalı girdiniz!", "danger")
            return redirect(url_for('admin_sifre_degistir'))
            
        if yeni_sifre != yeni_sifre_tekrar:
            flash("Yeni girdiğiniz şifreler birbiriyle eşleşmiyor!", "danger")
            return redirect(url_for('admin_sifre_degistir'))
            
        if len(yeni_sifre) < 6:
            flash("Yeni şifreniz en az 6 karakter olmalıdır!", "danger")
            return redirect(url_for('admin_sifre_degistir'))
            
        admin.set_sifre(yeni_sifre)
        db.session.commit()
        flash("Şifreniz başarıyla güncellendi!", "success")
        return redirect(url_for('admin_panel'))
        
    return render_template('admin_sifre_degistir.html')


@app.route('/panel')
@admin_required
def admin_panel():
    arama_metni = request.args.get('arama', '').strip()
    secilen_brans = request.args.get('brans', '')
    secilen_kategori = request.args.get('kategori', '')
    secilen_durum = request.args.get('durum', '')
    
    sorgu = Sporcu.query
    
    if arama_metni:
        arama_filtresi = f"%{arama_metni.lower()}%"
        sorgu = sorgu.filter(
            db.or_(
                db.func.lower(Sporcu.ad_soyad).ilike(arama_filtresi),
                db.func.lower(Sporcu.tc_kimlik).ilike(arama_filtresi),
                db.func.lower(Sporcu.lisans_no).ilike(arama_filtresi),
                db.func.lower(Sporcu.benzersiz_id).ilike(arama_filtresi)
            )
        )
        
    if secilen_brans:
        sorgu = sorgu.filter(Sporcu.brans == secilen_brans)
        
    if secilen_kategori:
        sorgu = sorgu.filter(
            db.or_(
                Sporcu.kategori_1 == secilen_kategori,
                Sporcu.kategori_2 == secilen_kategori
            )
        )
        
    sporcular = sorgu.order_by(Sporcu.kayit_tarihi.desc()).all()
    
    for sporcu in sporcular:
        guncel_durum = sporcu_durumunu_guncelle_ve_getir(sporcu)
        try:
            sporcu.durum = guncel_durum
        except Exception:
            pass
        try:
            sporcu.statü = guncel_durum
        except Exception:
            pass
    db.session.commit()

    if secilen_durum:
        sporcular = [s for s in sporcular if getattr(s, 'durum', getattr(s, 'statü', 'Aktif')) == secilen_durum]
    
    return render_template('panel.html', 
                           sporcular=sporcular, 
                           arama_metni=arama_metni, 
                           secilen_brans=secilen_brans, 
                           secilen_kategori=secilen_kategori,
                           secilen_durum=secilen_durum)

@app.route('/odemesi-gecikenler')
@admin_required
def odemesi_gecikenler():
    tum_sporcular = Sporcu.query.all()
    gecikenler = []
    
    for sporcu in tum_sporcular:
        guncel_durum = sporcu_durumunu_guncelle_ve_getir(sporcu)
        if guncel_durum in ['Beklemede', 'Pasif']:
            gecikenler.append(sporcu)
            
    return render_template('odemesi_gecikenler.html', sporcular=gecikenler)

@app.route('/admin/sporcu-duzenle/<int:id>', methods=['GET', 'POST'])
@admin_required
def admin_sporcu_duzenle(id):
    sporcu = Sporcu.query.get_or_404(id)
    
    if request.method == 'POST':
        sporcu.ad_soyad = request.form.get('ad_soyad', '').strip()
        sporcu.kullanici_adi = request.form.get('kullanici_adi', '').strip()
        sporcu.tc_kimlik = request.form.get('tc_kimlik', '').strip()
        sporcu.lisans_no = request.form.get('lisans_no', '').strip()
        sporcu.dogum_tarihi = format_tarih_tr(request.form.get('dogum_tarihi', '').strip())
        sporcu.cinsiyet = request.form.get('cinsiyet')
        sporcu.kan_grubu = request.form.get('kan_grubu')
        
        # Kayıt tarihi güncellemesi
        ham_kayit_tarihi = request.form.get('kayit_tarihi', '').strip()
        if ham_kayit_tarihi:
            try:
                sporcu.kayit_tarihi = datetime.datetime.strptime(ham_kayit_tarihi, '%Y-%m-%d')
            except ValueError:
                pass

        sporcu.telefon = request.form.get('telefon', '').strip()
        sporcu.okulu = request.form.get('okulu')
        sporcu.sinif_sube = request.form.get('sinif_sube')
        sporcu.brans = request.form.get('brans')
        sporcu.kategori_1 = request.form.get('kategori_1')
        sporcu.kategori_2 = request.form.get('kategori_2')
        sporcu.lig_statusu_1 = request.form.get('lig_statusu_1')
        sporcu.lig_statusu_2 = request.form.get('lig_statusu_2')
        sporcu.il = request.form.get('il', 'İstanbul')
        sporcu.ilce = request.form.get('ilce', 'Gaziosmanpaşa')
        sporcu.adres = request.form.get('adres')
        sporcu.alerji = request.form.get('alerji')
        sporcu.kronik_hastalik = request.form.get('kronik_hastalik')
        sporcu.ilac_1 = request.form.get('ilac_1')
        sporcu.ilac_2 = request.form.get('ilac_2')
        sporcu.anne_adi = request.form.get('anne_adi')
        sporcu.anne_tel = request.form.get('anne_tel', '').strip()
        sporcu.baba_adi = request.form.get('baba_adi')
        sporcu.baba_tel = request.form.get('baba_tel', '').strip()
        
        # ŞİFRE GÜNCELLEME KONTROLÜ
        yeni_sifre = request.form.get('sifre', '').strip()
        if yeni_sifre:
            sporcu.set_sifre(yeni_sifre)
        
        if 'profil_foto' in request.files:
            dosya = request.files['profil_foto']
            if dosya and dosya.filename != '':
                filename = secure_filename(f"{sporcu.tc_kimlik}_{int(datetime.datetime.utcnow().timestamp())}_{dosya.filename}")
                dosya.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
                sporcu.profil_foto = filename
        
        db.session.commit()
        flash("Sporcu bilgileri başarıyla güncellendi!", "success")
        return redirect(url_for('admin_panel'))
        
    bugun_str = datetime.date.today().strftime('%Y-%m-%d')
    return render_template('sporcu_ekle.html', sporcu=sporcu, duzenleme_modu=True, bugun=bugun_str)

@app.route('/admin/sporcu-sil/<int:id>')
def admin_sporcu_sil(id):
    if 'admin_giris' not in session:
        flash('Lütfen önce yönetici girişi yapın.', 'danger')
        return redirect(url_for('admin_giris'))
    
    sporcu = Sporcu.query.get_or_404(id)
    db.session.delete(sporcu)
    db.session.commit()
    
    flash('Sporcu başarıyla sistemden silindi.', 'success')
    return redirect(url_for('admin_panel'))

@app.route('/admin/sporcu-ekle', methods=['GET', 'POST'])
@admin_required
def admin_sporcu_ekle():
    if request.method == 'POST':
        kullanici_adi = request.form.get('kullanici_adi', '').strip()
        tc_kimlik = request.form.get('tc_kimlik', '').strip()
        ham_sifre = request.form.get('sifre', '').strip()
        ham_dogum_tarihi = request.form.get('dogum_tarihi', '').strip()
        ham_kayit_tarihi = request.form.get('kayit_tarihi', '').strip() # Formdan gelen kayıt tarihi
        cinsiyet = request.form.get('cinsiyet')

        if len(tc_kimlik) != 11 or not tc_kimlik.isdigit():
            flash("T.C. Kimlik Numarası tam 11 haneli sayıdan oluşmalıdır!", "danger")
            return render_template('sporcu_ekle.html', bugun=datetime.date.today().strftime('%Y-%m-%d'))

        if Sporcu.query.filter((Sporcu.kullanici_adi == kullanici_adi) | (Sporcu.tc_kimlik == tc_kimlik)).first():
            flash("Bu kullanıcı adı veya TC Kimlik No ile zaten kayıtlı bir sporcu var!", "danger")
            return render_template('sporcu_ekle.html', bugun=datetime.date.today().strftime('%Y-%m-%d'))

        # Kayıt tarihini ayarla (Eğer seçilmediyse bugünün tarihi)
        kayit_tarihi_obj = datetime.datetime.utcnow()
        if ham_kayit_tarihi:
            try:
                kayit_tarihi_obj = datetime.datetime.strptime(ham_kayit_tarihi, '%Y-%m-%d')
            except ValueError:
                pass

        if cinsiyet == 'Kadın':
            profil_foto_yolu = "default_kiz.png"
        else:
            profil_foto_yolu = "default_erkek.png"

        if 'profil_foto' in request.files:
            dosya = request.files['profil_foto']
            if dosya and dosya.filename != '':
                filename = secure_filename(f"{tc_kimlik}_{int(datetime.datetime.utcnow().timestamp())}_{dosya.filename}")
                dosya.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
                profil_foto_yolu = filename

        yeni_id = Sporcu.benzersiz_id_olustur()
        dogum_tarihi_tr = format_tarih_tr(ham_dogum_tarihi)

        yeni_sporcu = Sporcu(
            benzersiz_id=yeni_id,
            kullanici_adi=kullanici_adi,
            ad_soyad=request.form.get('ad_soyad', '').strip(),
            tc_kimlik=tc_kimlik,
            lisans_no=request.form.get('lisans_no', '').strip(),
            dogum_tarihi=dogum_tarihi_tr,
            kayit_tarihi=kayit_tarihi_obj, # <--- Belirlenen kayıt tarihi buraya atanıyor
            cinsiyet=cinsiyet,
            kan_grubu=request.form.get('kan_grubu'),
            okulu=request.form.get('okulu'),
            sinif_sube=request.form.get('sinif_sube'),
            telefon=request.form.get('telefon', '').strip(),
            brans=request.form.get('brans'),
            kategori_1=request.form.get('kategori_1'),
            kategori_2=request.form.get('kategori_2'),
            lig_statusu_1=request.form.get('lig_statusu_1'),
            lig_statusu_2=request.form.get('lig_statusu_2'),
            il=request.form.get('il', 'İstanbul'),
            ilce=request.form.get('ilce', 'Gaziosmanpaşa'),
            adres=request.form.get('adres'),
            alerji=request.form.get('alerji'),
            kronik_hastalik=request.form.get('kronik_hastalik'),
            ilac_1=request.form.get('ilac_1'),
            ilac_2=request.form.get('ilac_2'),
            anne_adi=request.form.get('anne_adi'),
            anne_tel=request.form.get('anne_tel', '').strip(),
            baba_adi=request.form.get('baba_adi'),
            baba_tel=request.form.get('baba_tel', '').strip(),
            profil_foto=profil_foto_yolu
        )
        yeni_sporcu.set_sifre(ham_sifre)

        db.session.add(yeni_sporcu)
        db.session.flush()

        ilk_olcum = Olcum(
            sporcu_id=yeni_sporcu.id,
            tarih_saat=datetime.datetime.now(),
            boy=safe_float(request.form.get('boy')),
            kilo=safe_float(request.form.get('kilo')),
            el_yuksekligi=safe_float(request.form.get('el_yuksekligi')),
            smac_yuksekligi=safe_float(request.form.get('smac_yuksekligi')),
            mekik=safe_int(request.form.get('mekik')),
            sinav=safe_int(request.form.get('sinav')),
            sag_esneklik=safe_float(request.form.get('sag_esneklik')),
            sol_esneklik=safe_float(request.form.get('sol_esneklik')),
            t_testi=safe_float(request.form.get('t_testi'))
        )

        db.session.add(ilk_olcum)
        db.session.commit()

        return redirect(url_for('kayit_basarili', ad=yeni_sporcu.ad_soyad, k_adi=yeni_sporcu.kullanici_adi, passw=ham_sifre, b_id=yeni_id))

    bugun_str = datetime.date.today().strftime('%Y-%m-%d')
    return render_template('sporcu_ekle.html', bugun=bugun_str)

@app.route('/kayit-basarili')
@admin_required
def kayit_basarili():
    ad = request.args.get('ad', 'Sporcu')
    k_adi = request.args.get('k_adi')
    passw = request.args.get('passw')
    b_id = request.args.get('b_id')
    mesaj = f"{ad} isimli sporcunun kaydı başarıyla oluşturulmuştur."
    return render_template('kayit_basarili.html', mesaj=mesaj, kullanici_adi=k_adi, sifre=passw, benzersiz_id=b_id)

@app.route('/admin/sporcu-odeme/<int:id>', methods=['GET', 'POST'])
@admin_required
def admin_sporcu_odeme(id):
    sporcu = Sporcu.query.get_or_404(id)
    
    if request.method == 'POST':
        tutar_str = request.form.get('tutar', '').strip()
        secilen_aylar = request.form.getlist('aylar') # Checkbox'tan gelen seçili aylar
        
        if not tutar_str:
            flash("Lütfen geçerli bir ödeme tutarı giriniz.", "danger")
            return redirect(url_for('admin_sporcu_odeme', id=sporcu.id))
            
        if not secilen_aylar:
            flash("Lütfen ödemenin ait olduğu en az bir ay seçiniz.", "danger")
            return redirect(url_for('admin_sporcu_odeme', id=sporcu.id))
            
        try:
            tutar = float(tutar_str)
        except ValueError:
            flash("Tutar sayısal bir değer olmalıdır.", "danger")
            return redirect(url_for('admin_sporcu_odeme', id=sporcu.id))
            
        # Seçilen ayları virgülle birleştirip metin olarak kaydediyoruz
        aylar_metni = ", ".join(secilen_aylar)
        
        yeni_odeme = Odeme(
            sporcu_id=sporcu.id,
            tutar=tutar,
            aylar=aylar_metni
        )
        
        db.session.add(yeni_odeme)
        db.session.commit()
        
        flash(f"{sporcu.ad_soyad} için {tutar} TL ödeme başarıyla kaydedildi!", "success")
        return redirect(url_for('admin_sporcu_odeme', id=sporcu.id))
        
    # Sporcunun geçmiş ödemelerini listelemek için çekiyoruz
    odemeler = Odeme.query.filter_by(sporcu_id=sporcu.id).order_by(Odeme.tarih.desc()).all()
    return render_template('admin_odeme_ekle.html', sporcu=sporcu, odemeler=odemeler)

# --- BURAYA, SOL KENARDAN HİÇ ÇIKINTI YAPMADAN YAPIŞTIRIN ---
@app.route('/admin/odeme-sil/<int:id>', methods=['POST'])
@admin_required
def admin_odeme_sil(id):
    odeme = Odeme.query.get_or_404(id)
    sporcu_id = odeme.sporcu_id
    
    db.session.delete(odeme)
    db.session.commit()
    
    flash("Ödeme kaydı başarıyla silindi.", "success")
    return redirect(url_for('admin_sporcu_odeme', id=sporcu_id))

@app.route('/admin/olcumler', methods=['GET', 'POST'])
@admin_required
def admin_olcumler():
    if request.method == 'POST':
        sporcu_id = safe_int(request.form.get('sporcu_id'))
        if not sporcu_id:
            flash("Lütfen bir sporcu seçin!", "danger")
            return redirect(url_for('admin_olcumler'))

        yeni_olcum = Olcum(
            sporcu_id=sporcu_id,
            tarih_saat=datetime.datetime.now(),
            boy=safe_float(request.form.get('boy')),
            kilo=safe_float(request.form.get('kilo')),
            el_yuksekligi=safe_float(request.form.get('el_yuksekligi')),
            smac_yuksekligi=safe_float(request.form.get('smac_yuksekligi')),
            mekik=safe_int(request.form.get('mekik')),
            sinav=safe_int(request.form.get('sinav')),
            sag_esneklik=safe_float(request.form.get('sag_esneklik')),
            sol_esneklik=safe_float(request.form.get('sol_esneklik')),
            t_testi=safe_float(request.form.get('t_testi'))
        )
        db.session.add(yeni_olcum)
        db.session.commit()
        flash("Yeni ölçüm başarıyla kaydedildi!", "success")
        return redirect(url_for('admin_olcumler'))

    sporcular = Sporcu.query.order_by(Sporcu.ad_soyad.asc()).all()
    son_olcumler = Olcum.query.order_by(Olcum.tarih_saat.desc()).all()
    return render_template('admin_olcumler.html', sporcular=sporcular, olcumler=son_olcumler)

@app.route('/admin/sporcu/<int:sporcu_id>/odemeler', methods=['GET', 'POST'])
@admin_required
def sporcu_odemeleri(sporcu_id):
    sporcu = Sporcu.query.get_or_404(sporcu_id)
    
    sporcu.statü = sporcu_durumunu_guncelle_ve_getir(sporcu)
    db.session.commit()

    if request.method == 'POST':
        odeme_id = request.form.get('odeme_id')
        odeme = Odeme.query.get_or_404(odeme_id)
        
        odeme.odendi_mi = True if request.form.get('odendi_mi') == 'on' else False
        db.session.commit()
        
        flash(f"{sporcu.ad_soyad} için {odeme.ay}/{odeme.yil} ödeme durumu güncellendi.", "success")
        return redirect(url_for('sporcu_odemeleri', sporcu_id=sporcu.id))

    odemeler = Odeme.query.filter_by(sporcu_id=sporcu.id).order_by(Odeme.yil.asc(), Odeme.ay.asc()).all()
    
    return render_template('sporcu_odemeleri.html', sporcu=sporcu, odemeler=odemeler)

# --- BİRLEŞTİRİLMİŞ TEK GİRİŞ KAPISI (YÖNETİCİ + SPORCU) ---
@app.route('/sporcu/giris', methods=['GET', 'POST'])
def sporcu_giris():
    if request.method == 'POST':
        kullanici_adi = request.form.get('kullanici_adi', '').strip()
        sifre = request.form.get('sifre', '').strip()

        # 1. Önce girilen bilgilerin bir YÖNETİCİ olup olmadığını kontrol et
        admin = Admin.query.filter_by(kullanici_adi=kullanici_adi).first()
        if admin and admin.check_sifre(sifre):
            session['admin_logged_in'] = True
            session['admin_kullanici_adi'] = admin.kullanici_adi
            return redirect(url_for('admin_panel'))

        # 2. Yönetici değilse SPORCU tablosunu kontrol et
        sporcu = Sporcu.query.filter_by(kullanici_adi=kullanici_adi).first()
        if sporcu and sporcu.check_sifre(sifre):
            session['sporcu_id'] = sporcu.id
            session['sporcu_kullanici_adi'] = sporcu.kullanici_adi

            if not sporcu.ilk_giris_yapildi:
                return redirect(url_for('sifre_yenile'))

            return redirect(url_for('sporcu_paneli'))
        
        # 3. İkisi de uyuşmazsa hata mesajı döndür
        return render_template('sporcu_giris.html', hata="Kullanıcı adı veya şifre hatalı!")

    return render_template('sporcu_giris.html')

@app.route('/sifre-yenile', methods=['GET', 'POST'])
@sporcu_required
def sifre_yenile():
    sporcu = Sporcu.query.get(session['sporcu_id'])

    if request.method == 'POST':
        yeni_sifre = request.form.get('yeni_sifre', '').strip()
        yeni_sifre_tekrar = request.form.get('yeni_sifre_tekrar', '').strip()

        if yeni_sifre != yeni_sifre_tekrar:
            return render_template('sifre_yenile.html', hata="Girdiğiniz şifreler birbiriyle eşleşmiyor.")

        if len(yeni_sifre) < 6:
            return render_template('sifre_yenile.html', hata="Şifreniz en az 6 karakter olmalıdır.")

        sporcu.set_sifre(yeni_sifre)
        sporcu.ilk_giris_yapildi = True
        db.session.commit()

        flash("Şifreniz başarıyla güncellendi.", "success")
        return redirect(url_for('sporcu_paneli'))

    return render_template('sifre_yenile.html')

@app.route('/sporcu/panel')
@sporcu_required
def sporcu_paneli():
    sporcu = Sporcu.query.get(session['sporcu_id'])
    if not sporcu.ilk_giris_yapildi:
        return redirect(url_for('sifre_yenile'))

    guncel_durum = sporcu_durumunu_guncelle_ve_getir(sporcu)
    try:
        sporcu.durum = guncel_durum
    except Exception:
        pass
    try:
        sporcu.statü = guncel_durum
    except Exception:
        pass
    db.session.commit()

    olcumler = Olcum.query.filter_by(sporcu_id=sporcu.id).order_by(Olcum.tarih_saat.asc()).all()
    return render_template('sporcu_paneli.html', sporcu=sporcu, olcumler=olcumler)


# --- BURAYA EKLEYEBİLİRSİNİZ ---
@app.route('/sporcu/ayarlar', methods=['GET', 'POST'])
@sporcu_required
def sporcu_ayarlar():
    sporcu_id = session.get('sporcu_id')
    sporcu = Sporcu.query.get_or_404(sporcu_id)
    
    if request.method == 'POST':
        # 1. Şifre Değiştirme İşlemi (Eğer alanlar doldurulduysa)
        eski_sifre = request.form.get('eski_sifre', '').strip()
        yeni_sifre = request.form.get('yeni_sifre', '').strip()
        yeni_sifre_tekrar = request.form.get('yeni_sifre_tekrar', '').strip()
        
        if eski_sifre or yeni_sifre or yeni_sifre_tekrar:
            if not sporcu.check_sifre(eski_sifre):
                flash("Mevcut şifrenizi hatalı girdiniz!", "danger")
                return redirect(url_for('sporcu_ayarlar'))
                
            if yeni_sifre != yeni_sifre_tekrar:
                flash("Yeni girdiğiniz şifreler birbiriyle eşleşmiyor!", "danger")
                return redirect(url_for('sporcu_ayarlar'))
                
            if len(yeni_sifre) < 6:
                flash("Yeni şifreniz en az 6 karakter olmalıdır!", "danger")
                return redirect(url_for('sporcu_ayarlar'))
                
            sporcu.set_sifre(yeni_sifre)
            
        # 2. Profil Fotoğrafı Güncelleme İşlemi
        if 'profil_foto' in request.files:
            dosya = request.files['profil_foto']
            if dosya and dosya.filename != '':
                filename = secure_filename(f"{sporcu.tc_kimlik}_{int(datetime.datetime.utcnow().timestamp())}_{dosya.filename}")
                dosya.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
                sporcu.profil_foto = filename
                
        db.session.commit()
        flash("Profil ayarlarınız başarıyla güncellendi!", "success")
        return redirect(url_for('sporcu_paneli'))
        
    return render_template('sporcu_ayarlar.html', sporcu=sporcu)



@app.route('/sporcu/gelisim')
@sporcu_required
def sporcu_gelisim():
    sporcu = Sporcu.query.get(session['sporcu_id'])
    olcumler = Olcum.query.filter_by(sporcu_id=sporcu.id).order_by(Olcum.tarih_saat.asc()).all()
    return render_template('sporcu_gelisim.html', sporcu=sporcu, olcumler=olcumler)

@app.route('/sporcu/cikis')
def sporcu_cikis():
    session.pop('sporcu_id', None)
    session.pop('sporcu_kullanici_adi', None)
    session.pop('admin_logged_in', None)
    session.pop('admin_kullanici_adi', None)
    return redirect(url_for('sporcu_giris'))

@app.route('/admin/muhasebe', methods=['GET', 'POST'])
@admin_required
def admin_muhasebe():
    if request.method == 'POST':
        aciklama = request.form.get('aciklama', '').strip()
        tutar_str = request.form.get('tutar', '').strip()
        
        if not aciklama or not tutar_str:
            flash("Lütfen gider açıklaması ve tutarı giriniz.", "danger")
            return redirect(url_for('admin_muhasebe'))
        
        try:
            tutar = float(tutar_str)
        except ValueError:
            flash("Tutar sayısal bir değer olmalıdır.", "danger")
            return redirect(url_for('admin_muhasebe'))
            
        yeni_gider = Gider(aciklama=aciklama, tutar=tutar)
        db.session.add(yeni_gider)
        db.session.commit()
        
        flash("Gider başarıyla kaydedildi.", "success")
        return redirect(url_for('admin_muhasebe'))

    # Sayfa başına 10 kayıt olacak şekilde sayfalama (Pagination)
    gelir_sayfa = request.args.get('gelir_sayfa', 1, type=int)
    gider_sayfa = request.args.get('gider_sayfa', 1, type=int)
    
    gelirler_pag = Odeme.query.order_by(Odeme.tarih.desc()).paginate(page=gelir_sayfa, per_page=10, error_out=False)
    giderler_pag = Gider.query.order_by(Gider.tarih.desc()).paginate(page=gider_sayfa, per_page=10, error_out=False)
    
    # Üst kartlar için genel toplamlar
    tum_gelirler = Odeme.query.all()
    tum_giderler = Gider.query.all()
    
    toplam_gelir = sum(g.tutar for g in tum_gelirler)
    toplam_gider = sum(gi.tutar for gi in tum_giderler)
    net_durum = toplam_gelir - toplam_gider
    
    return render_template('muhasebe.html', 
                           gelirler_pag=gelirler_pag, 
                           giderler_pag=giderler_pag, 
                           toplam_gelir=toplam_gelir, 
                           toplam_gider=toplam_gider, 
                           net_durum=net_durum)

@app.route('/admin/gider-sil/<int:id>', methods=['POST'])
@admin_required
def admin_gider_sil(id):
    gider = Gider.query.get_or_404(id)
    db.session.delete(gider)
    db.session.commit()
    flash("Gider kaydı silindi.", "success")
    return redirect(url_for('admin_muhasebe'))

@app.route('/admin/muhasebe/excel')
@admin_required
def muhasebe_excel():
    si = StringIO()
    writer = csv.writer(si, delimiter=';') # Türkçe Excel uyumu için noktalı virgül
    
    writer.writerow(['ARCKHE SPOR KULÜBÜ - MUHASEBE RAPORU'])
    writer.writerow([])
    
    # Gelirler Bölümü
    writer.writerow(['--- GELİRLER (AİDATLAR) ---'])
    writer.writerow(['Tarih', 'Sporcu Adı', 'Ödenen Aylar', 'Tutar (TL)'])
    gelirler = Odeme.query.order_by(Odeme.tarih.desc()).all()
    toplam_gelir = 0
    for g in gelirler:
        sporcu_adi = g.sporcu.ad_soyad if g.sporcu else 'Bilinmiyor'
        writer.writerow([g.tarih.strftime('%d.%m.%Y'), sporcu_adi, g.aylar, f"{g.tutar:.2f}"])
        toplam_gelir += g.tutar
    writer.writerow(['Toplam Gelir', '', '', f"{toplam_gelir:.2f}"])
    writer.writerow([])
    
    # Giderler Bölümü
    writer.writerow(['--- GİDERLER ---'])
    writer.writerow(['Tarih', 'Açıklama', '', 'Tutar (TL)'])
    giderler = Gider.query.order_by(Gider.tarih.desc()).all()
    toplam_gider = 0
    for gi in giderler:
        writer.writerow([gi.tarih.strftime('%d.%m.%Y'), gi.aciklama, '', f"{gi.tutar:.2f}"])
        toplam_gider += gi.tutar
    writer.writerow(['Toplam Gider', '', '', f"{toplam_gider:.2f}"])
    writer.writerow([])
    
    # Net Kasa Durumu Özeti
    net_durum = toplam_gelir - toplam_gider
    writer.writerow(['--- GENEL BÜTÇE ÖZETİ ---'])
    writer.writerow(['Toplam Gelir', f"{toplam_gelir:.2f} TL"])
    writer.writerow(['Toplam Gider', f"{toplam_gider:.2f} TL"])
    writer.writerow(['Net Kasa Durumu', f"{net_durum:.2f} TL"])
    
    output = si.getvalue().encode('utf-8-sig') # Türkçe karakterlerin bozulmaması için BOM
    response = make_response(output)
    response.headers["Content-Disposition"] = "attachment; filename=muhasebe_raporu.csv"
    response.headers["Content-type"] = "text/csv; charset=utf-8-sig"
    return response

# Belge Yükleme Klasörü ve İzin Verilen Uzantılar
UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = {'pdf', 'png', 'jpg', 'jpeg', 'doc', 'docx', 'xls', 'xlsx'}

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# Ziyaretçiler İçin Belgeler Sayfası
@app.route('/belgeler')
def belgeler():
    belgeler_listesi = Belge.query.order_by(Belge.tarih.desc()).all()
    return render_template('belgeler.html', belgeler=belgeler_listesi)

# Dosya İndirme Rotosu
@app.route('/belge-indir/<int:id>')
def belge_indir(id):
    belge = Belge.query.get_or_404(id)
    return send_from_directory(UPLOAD_FOLDER, belge.dosya_adi, as_attachment=True)

# Yönetici (Admin) Belge Yönetim ve Yükleme Rotosu
@app.route('/admin/belgeler', methods=['GET', 'POST'])
@admin_required
def admin_belgeler():
    if request.method == 'POST':
        baslik = request.form.get('baslik')
        file = request.files.get('dosya')
        
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            dosya_yolu = os.path.join(UPLOAD_FOLDER, filename)
            
            os.makedirs(UPLOAD_FOLDER, exist_ok=True)
            file.save(dosya_yolu)
            
            yeni_belge = Belge(baslik=baslik, dosya_adi=filename)
            db.session.add(yeni_belge)
            db.session.commit()
            flash('Belge başarıyla yüklendi!', 'success')
            return redirect(url_for('admin_belgeler'))
        else:
            flash('Geçersiz dosya formatı!', 'danger')
            
    belgeler_listesi = Belge.query.order_by(Belge.tarih.desc()).all()
    return render_template('admin_belgeler.html', belgeler=belgeler_listesi)

# Yönetici Belge Silme Rotosu
@app.route('/admin/belge-sil/<int:id>', methods=['POST'])
@admin_required
def admin_belge_sil(id):
    belge = Belge.query.get_or_404(id)
    dosya_yolu = os.path.join(UPLOAD_FOLDER, belge.dosya_adi)
    if os.path.exists(dosya_yolu):
        os.remove(dosya_yolu)
    db.session.delete(belge)
    db.session.commit()
    flash('Belge silindi.', 'info')
    return redirect(url_for('admin_belgeler'))

if __name__ == '__main__':
    app.run(debug=True)