import time
from flask import Blueprint, jsonify, request, session
from core.db import get_db
from core.security import check_master
from services.auth_service import is_setup_done, do_setup, check_password, get_dukkan_adi, reset_password

auth_bp = Blueprint('auth', __name__)

# --- Brute force koruması (in-memory, process bazlı) ---
# { ip: {'count': int, 'locked_until': float} }
_login_attempts = {}
MAX_ATTEMPTS   = 5
LOCKOUT_SEC    = 180  # 3 dakika


def _get_ip():
    return request.remote_addr or '127.0.0.1'


def _is_locked(ip):
    """Kilit kontrolü. Kilitliyse kalan saniyeyi döndürür, değilse 0."""
    entry = _login_attempts.get(ip)
    if not entry:
        return 0
    if entry['count'] >= MAX_ATTEMPTS:
        kalan = entry['locked_until'] - time.time()
        if kalan > 0:
            return int(kalan)
        else:
            # Süre doldu, sıfırla
            _login_attempts.pop(ip, None)
    return 0


def _register_fail(ip):
    entry = _login_attempts.setdefault(ip, {'count': 0, 'locked_until': 0})
    entry['count'] += 1
    if entry['count'] >= MAX_ATTEMPTS:
        entry['locked_until'] = time.time() + LOCKOUT_SEC


def _clear_attempts(ip):
    _login_attempts.pop(ip, None)


# --- Endpointler ---

@auth_bp.route('/api/kilit-durumu')
def kilit_durumu():
    """Sayfa yüklendiğinde mevcut kilit durumunu döndürür."""
    ip = _get_ip()
    kalan = _is_locked(ip)
    if kalan > 0:
        return jsonify({'kilitli': True, 'kalan_sn': kalan})
    return jsonify({'kilitli': False, 'kalan_sn': 0})



@auth_bp.route('/api/durum')
def durum():
    return jsonify({'kurulum': is_setup_done()})


@auth_bp.route('/api/kurulum', methods=['POST'])
def kurulum():
    if is_setup_done():
        return jsonify({'ok': False, 'hata': 'Kurulum zaten tamamlandi'})
    d = request.json or {}
    dukkan = (d.get('dukkan_adi') or '').strip()
    parola = (d.get('parola') or '').strip()
    if not dukkan or not parola:
        return jsonify({'ok': False, 'hata': 'Dukkan adi ve parola zorunlu'})
    db = get_db()
    do_setup(db, dukkan, parola)
    session['giris'] = True
    return jsonify({'ok': True, 'dukkan_adi': dukkan})


@auth_bp.route('/api/giris', methods=['POST'])
def giris():
    if not is_setup_done():
        return jsonify({'ok': False, 'hata': 'Kurulum tamamlanmamis'})

    ip = _get_ip()

    # Kilit kontrolü
    kalan = _is_locked(ip)
    if kalan > 0:
        dk = kalan // 60
        sn = kalan % 60
        return jsonify({
            'ok': False,
            'hata': f'Çok fazla hatalı giriş. {dk}dk {sn}sn sonra tekrar deneyin.',
            'kilitli': True,
            'kalan_sn': kalan
        }), 429

    d = request.json or {}
    parola = (d.get('parola') or '').strip()
    db = get_db()

    # Önce master şifre kontrolü
    if check_master(parola):
        _clear_attempts(ip)
        session['giris'] = True
        session['master'] = True
        return jsonify({
            'ok': True,
            'dukkan_adi': get_dukkan_adi(db),
            'master': True  # Frontend şifre sıfırlama ekranını açar
        })

    # Normal şifre kontrolü
    if check_password(db, parola):
        _clear_attempts(ip)
        session['giris'] = True
        session.pop('master', None)
        return jsonify({'ok': True, 'dukkan_adi': get_dukkan_adi(db)})

    # Başarısız giriş
    _register_fail(ip)
    entry = _login_attempts.get(ip, {})
    kalan_hak = max(0, MAX_ATTEMPTS - entry.get('count', 0))

    if kalan_hak == 0:
        return jsonify({
            'ok': False,
            'hata': f'Çok fazla hatalı giriş. 3 dakika beklemeniz gerekiyor.',
            'kilitli': True,
            'kalan_sn': LOCKOUT_SEC
        }), 429

    return jsonify({
        'ok': False,
        'hata': f'Parola hatalı. {kalan_hak} deneme hakkınız kaldı.'
    })


@auth_bp.route('/api/cikis', methods=['POST'])
def cikis():
    session.clear()
    return jsonify({'ok': True})


@auth_bp.route('/api/dukkan')
def dukkan_bilgi():
    db = get_db()
    return jsonify({'dukkan_adi': get_dukkan_adi(db)})


@auth_bp.route('/api/sifre-sifirla', methods=['POST'])
def sifre_sifirla():
    """Sadece master session ile erişilebilir — yeni şifre belirler."""
    if not session.get('master'):
        return jsonify({'ok': False, 'hata': 'Yetkisiz'}), 403

    d = request.json or {}
    yeni = (d.get('yeni_parola') or '').strip()
    tekrar = (d.get('yeni_parola_tekrar') or '').strip()

    if len(yeni) < 4:
        return jsonify({'ok': False, 'hata': 'Şifre en az 4 karakter olmalı'})
    if yeni != tekrar:
        return jsonify({'ok': False, 'hata': 'Şifreler eşleşmiyor'})

    db = get_db()
    reset_password(db, yeni)

    # Master session'ı temizle, normal giriş gibi devam et
    session.pop('master', None)

    return jsonify({'ok': True, 'mesaj': 'Şifre başarıyla güncellendi.'})
