import uuid
from datetime import datetime
from flask import Blueprint, render_template, request, redirect, url_for, flash
from flask_login import login_required, current_user
from app.extensions import db
from app.models.features import Referral
from app.models.user import User

referral_bp = Blueprint("referral", __name__, url_prefix="/referral")


def _get_or_create_referral_code(user):
    if user.referral_code:
        return user.referral_code
    code = f"JADWA-{uuid.uuid4().hex[:6].upper()}"
    user.referral_code = code
    db.session.commit()
    return code


@referral_bp.route("/")
@login_required
def index():
    code = _get_or_create_referral_code(current_user)
    referrals = Referral.query.filter_by(referrer_id=current_user.id).order_by(Referral.created_at.desc()).all()
    total_converted = sum(1 for r in referrals if r.status == "converted")
    return render_template("referral/index.html", code=code, referrals=referrals, total_converted=total_converted)


def apply_referral(new_user, referral_code):
    if not referral_code:
        return
    referrer = User.query.filter_by(referral_code=referral_code).first()
    if not referrer or referrer.id == new_user.id:
        return
    ref = Referral.query.filter_by(code=referral_code, referred_id=None, referrer_id=referrer.id).first()
    if not ref:
        ref = Referral(referrer_id=referrer.id, code=referral_code)
        db.session.add(ref)
    ref.referred_id = new_user.id
    ref.status = "converted"
    ref.converted_at = datetime.utcnow()
    new_user.referred_by = referral_code
    db.session.commit()
