import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import UniqueConstraint
from werkzeug.security import generate_password_hash, check_password_hash

db = SQLAlchemy()

class Admin(db.Model):
    __tablename__ = 'adminler'

    id = db.Column(db.Integer, primary_key=True)
    kullanici_adi = db.Column(db.String(50), unique=True, nullable=False)
    sifre_hash = db.Column(db.String(255), nullable=False)

    def set_sifre(self, sifre):
        self.sifre_hash = generate_password_hash(sifre)

    def check_sifre(self, sifre):
        return check_password_hash(self.sifre_hash, sifre)


class Sporcu(db.Model):
    __tablename__ = 'sporcular'

    id = db.Column(db.Integer, primary_key=True)
    
    # Otomatik Oluşturulan Benzersiz ID (Örn: 2026001, 2026002)
    benzersiz_id = db.Column(db.String(20), unique=True, nullable=False)
    
    # GİRİŞ VE KİŞİSEL BİLGİLER
    ad_soyad = db.Column(db.String(100), nullable=False)
    tc_kimlik = db.Column(db.String(11), unique=True, nullable=False) # Tam 11 Hane
    lisans_no = db.Column(db.String(50), nullable=True)
    kullanici_adi = db.Column(db.String(50), unique=True, nullable=False)
    sifre_hash = db.Column(db.String(255), nullable=False)
    dogum_tarihi = db.Column(db.String(10), nullable=False) # Gün/Ay/Yıl (GG.AA.YYYY)
    cinsiyet = db.Column(db.String(10), nullable=False) # Kadın, Erkek
    kan_grubu = db.Column(db.String(10), nullable=False) # A Rh+, 0 Rh- vb.
    okulu = db.Column(db.String(100))
    sinif_sube = db.Column(db.String(20))
    telefon = db.Column(db.String(15)) # İletişim esnekliği için
    brans = db.Column(db.String(50), nullable=False) # Basketbol, Cimnastik, Satranç, Taekwondo, Voleybol
    
    # Kategoriler ve Lig Statüleri
    kategori_1 = db.Column(db.String(50)) # Minik, Midi, Küçük, Yıldız, Genç, Büyük
    kategori_2 = db.Column(db.String(50))
    lig_statusu_1 = db.Column(db.String(50)) # Süper Lig, 1. Lig, 2. Lig, Bölgesel Amatör, Büyük Kadın
    lig_statusu_2 = db.Column(db.String(50))
    
    # Adres Bilgileri
    il = db.Column(db.String(50), default="İstanbul")
    ilce = db.Column(db.String(50), default="Gaziosmanpaşa")
    adres = db.Column(db.Text)
    
    # TIBBİ VE AİLE BİLGİLERİ
    alerji = db.Column(db.String(255))
    kronik_hastalik = db.Column(db.String(255))
    ilac_1 = db.Column(db.String(255)) # Kullandığı İlaç 1
    ilac_2 = db.Column(db.String(255)) # Kullandığı İlaç 2
    
    anne_adi = db.Column(db.String(100))
    anne_tel = db.Column(db.String(15))
    baba_adi = db.Column(db.String(100))
    baba_tel = db.Column(db.String(15))
    
    # Sistem ve Durum Bilgileri
    profil_foto = db.Column(db.String(255), default="default.png")
    aidat_durumu = db.Column(db.String(20), default="Aktif")
    ilk_giris_yapildi = db.Column(db.Boolean, default=False)
    kayit_tarihi = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    # İlişkiler
    olcumler = db.relationship('Olcum', backref='sporcu', lazy=True, cascade="all, delete-orphan")
    odemeler = db.relationship('Odeme', backref='sporcu', lazy=True, cascade="all, delete-orphan")

    def set_sifre(self, sifre):
        self.sifre_hash = generate_password_hash(sifre)

    def check_sifre(self, sifre):
        return check_password_hash(self.sifre_hash, sifre)

    @staticmethod
    def benzersiz_id_olustur():
        """Kayıt yapılan yıl ve o yılki sıra numarasına göre güvenli ID üretir (Örn: 2026001)."""
        mevcut_yil = datetime.datetime.now().year
        son_sporcu = Sporcu.query.filter(Sporcu.benzersiz_id.like(f"{mevcut_yil}%")).order_by(Sporcu.id.desc()).first()
        
        if son_sporcu:
            try:
                sira = int(son_sporcu.benzersiz_id[4:]) + 1
            except (ValueError, IndexError):
                sira = Sporcu.query.filter(Sporcu.benzersiz_id.like(f"{mevcut_yil}%")).count() + 1
        else:
            sira = 1
            
        return f"{mevcut_yil}{sira:03d}"

class Gider(db.Model):
    __tablename__ = 'giderler'
    id = db.Column(db.Integer, primary_key=True)
    aciklama = db.Column(db.String(255), nullable=False)
    tutar = db.Column(db.Float, nullable=False)
    tarih = db.Column(db.DateTime, default=db.func.current_timestamp())    


class Odeme(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sporcu_id = db.Column(db.Integer, db.ForeignKey('sporcular.id'), nullable=False)
    tutar = db.Column(db.Float, nullable=False)
    aylar = db.Column(db.String(200), nullable=False)
    yil = db.Column(db.Integer, nullable=True) # <-- Bu sütunu ekleyin
    tarih = db.Column(db.DateTime, default=db.func.current_timestamp())


class Olcum(db.Model):
    __tablename__ = 'olcumler'

    id = db.Column(db.Integer, primary_key=True)
    sporcu_id = db.Column(db.Integer, db.ForeignKey('sporcular.id'), nullable=False)
    
    tarih_saat = db.Column(db.DateTime, default=lambda: datetime.datetime.now())
    boy = db.Column(db.Float)
    kilo = db.Column(db.Float)
    el_yuksekligi = db.Column(db.Float)
    smac_yuksekligi = db.Column(db.Float)
    mekik = db.Column(db.Integer)
    sinav = db.Column(db.Integer)
    sag_esneklik = db.Column(db.Float)
    sol_esneklik = db.Column(db.Float)
    t_testi = db.Column(db.Float)


class Evrak(db.Model):
    __tablename__ = 'evraklar'

    id = db.Column(db.Integer, primary_key=True)
    baslik = db.Column(db.String(150), nullable=False)
    dosya_yolu = db.Column(db.String(255), nullable=False)
    aciklama = db.Column(db.Text)
    yukleme_tarihi = db.Column(db.DateTime, default=lambda: datetime.datetime.now())

class Belge(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    baslik = db.Column(db.String(150), nullable=False)
    dosya_adi = db.Column(db.String(250), nullable=False)
    tarih = db.Column(db.DateTime, default=lambda: datetime.datetime.now())   