"""
Enterprise registration form handler.
Handles multi-step registration flow with comprehensive user data.
"""
from flask import request, flash, redirect, url_for, render_template, session
from flask_login import login_user
from app.routes.auth import auth_bp
from app.models.user import User
from app.auth.otp_service import generate_otp, generate_expires_at, send_otp_email_en
from app.extensions import db
from datetime import datetime


@auth_bp.route("/register-personal", methods=["GET", "POST"])
def register_personal():
    """
    Step 1: Personal information collection.
    """
    # Check if registration is enabled
    from app.models.features import SystemSetting
    if not SystemSetting.get("registration_enabled", default=True):
        return render_template("auth/registration_disabled.html")

    if request.method == "GET":
        # Clear any existing session data
        for key in list(session.keys()):
            if key.startswith('reg_') or key.startswith('registration_'):
                session.pop(key, None)
        return render_template("auth/register_personal.html")

    if request.method == "POST":
        # Personal info validation
        full_name = request.form.get('full_name', '').strip()
        phone = request.form.get('phone', '').strip()
        email = request.form.get('email', '').strip().lower()
        password = request.form.get('password', '').strip()
        confirm_password = request.form.get('confirm_password', '').strip()

        # Validation
        errors = []
        if not full_name:
            errors.append("الاسم الكامل مطلوب")
        elif len(full_name) < 3:
            errors.append("الاسم يجب أن يكون 3 أحرف على الأقل")

        if not phone:
            errors.append("رقم الهاتف مطلوب")
        elif not phone.startswith('+966'):
            errors.append("رقم الهاتف يجب أن يبدأ ب +966")

        if not email or '@' not in email:
            errors.append("البريد الإلكتروني مطلوب")

        if len(password) < 8:
            errors.append("كلمة المرور يجب أن تكون 8 أحرف على الأقل")

        if password != confirm_password:
            errors.append("كلمتا المرور غير متطابقتين")

        if errors:
            for error in errors:
                flash(error, "error")
            return render_template("auth/register_personal.html")

        # Check if email already exists
        if User.query.filter_by(email=email).first():
            flash("البريد الإلكتروني مسجل بالفعل", "error")
            return render_template("auth/register_personal.html")

        # Store data in session
        session['reg_full_name'] = full_name
        session['reg_phone'] = phone
        session['reg_email'] = email
        session['reg_password'] = password
        session['registration_step1'] = True

        # Generate and send OTP
        otp = generate_otp()
        expires_at = generate_expires_at()

        session['reg_otp'] = {
            'code': otp,
            'expires_at': expires_at.isoformat()
        }

        try:
            if send_otp_email_en(email, otp, full_name):
                session['registration_step2'] = True
                flash("تم إرسال رمز التحقق إلى بريدك الإلكتروني", "success")
                return redirect(url_for('auth.verify_otp'))
            else:
                flash("فشل إرسال رمز التحقق. يرجى المحاولة لاحقاً.", "error")
                return render_template("auth/register_personal.html")
        except Exception as e:
            flash(f"حدث خطأ أثناء إرسال رمز التحقق: {e}", "error")
            return render_template("auth/register_personal.html")


@auth_bp.route("/register-flow", methods=["GET", "POST"])
def register_flow():
    """
    Main registration form handler - Step 1: User data entry.
    """
    # Check if registration is enabled
    from app.models.features import SystemSetting
    if not SystemSetting.get("registration_enabled", default=True):
        return render_template("auth/registration_disabled.html")

    if request.method == "GET":
        # Check if user is already logged in
        if not session.get('registration_step1'):
            # Clear any existing session data
            for key in list(session.keys()):
                if key.startswith('reg_'):
                    session.pop(key, None)
            session['registration_step1'] = True

        return render_template("auth/register_flow.html")

    if request.method == "POST":
        step = int(request.form.get('step', '1'))

        if step == 1:
            # Personal info validation
            full_name = request.form.get('full_name', '').strip()
            phone = request.form.get('phone', '').strip()
            email = request.form.get('email', '').strip().lower()
            password = request.form.get('password', '').strip()
            confirm_password = request.form.get('confirm_password', '').strip()

            # Validation
            errors = []
            if not full_name:
                errors.append("الاسم الكامل مطلوب")
            elif len(full_name) < 3:
                errors.append("الاسم يجب أن يكون 3 أحرف على الأقل")

            if not phone:
                errors.append("رقم الهاتف مطلوب")
            elif not phone.startswith('+966'):
                errors.append("رقم الهاتف يجب أن يبدأ ب +966")

            if not email or '@' not in email:
                errors.append("البريد الإلكتروني مطلوب")

            if len(password) < 8:
                errors.append("كلمة المرور يجب أن تكون 8 أحرف على الأقل")

            if password != confirm_password:
                errors.append("كلمتا المرور غير متطابقتين")

            if errors:
                for error in errors:
                    flash(error, "error")
                return render_template("auth/register_flow.html")

            # Store data in session
            session['reg_full_name'] = full_name
            session['reg_phone'] = phone
            session['reg_email'] = email
            session['reg_password'] = password

            # Generate and send OTP
            otp = generate_otp()
            expires_at = generate_expires_at()

            session['reg_otp'] = {
                'code': otp,
                'expires_at': expires_at.isoformat()
            }

            try:
                if send_otp_email_en(email, otp, full_name):
                    session['registration_step2'] = True
                    flash("تم إرسال رمز التحقق إلى بريدك الإلكتروني", "success")
                    return redirect(url_for('auth.verify_otp'))
                else:
                    flash("فشل إرسال رمز التحقق. يرجى المحاولة لاحقاً.", "error")
                    return render_template("auth/register_flow.html")
            except Exception as e:
                flash(f"حدث خطأ أثناء إرسال رمز التحقق: {e}", "error")
                return render_template("auth/register_flow.html")

        elif step == 2:
            # This step is handled by verify_otp route
            return redirect(url_for('auth.verify_otp'))

        elif step == 3:
            # Complete registration
            full_name = session.get('reg_full_name', '')
            phone = session.get('reg_phone', '')
            email = session.get('reg_email', '')
            password = session.get('reg_password', '')

            # Company info
            industry_type = request.form.get('industry_type', 'other')
            company_size = request.form.get('company_size', '')
            company_stage = request.form.get('company_stage', '')
            company_sector = request.form.get('company_sector', '')
            target_market = request.form.get('target_market', 'local')
            budget_range = request.form.get('budget_range', '0')
            activity_type = request.form.get('activity_type', 'rd')

            # Validate required fields
            errors = []
            if not industry_type:
                errors.append("صنوع المنظمة مطلوب")
            if not company_size:
                errors.append("حجم الشركة مطلوب")
            if not company_stage:
                errors.append("مرحلة الشركة مطلوب")

            if errors:
                for error in errors:
                    flash(error, "error")
                return render_template("auth/register_flow.html")

            # Create user account
            try:
                user = User(
                    name=full_name,
                    full_name=full_name,
                    email=email,
                    phone=phone,
                )
                user.set_password(password)
                db.session.add(user)
                db.session.commit()

                # Store additional enterprise info
                if industry_type:
                    user.industry_type = industry_type
                if company_size:
                    user.company_size = company_size
                if company_stage:
                    user.company_stage = company_stage
                if company_sector:
                    user.company_sector = company_sector
                if target_market:
                    user.target_market = target_market
                if budget_range:
                    user.budget_range = budget_range
                if activity_type:
                    user.activity_type = activity_type

                # Set default values
                user.auth_provider = 'otp'
                user.email_verified = True
                user.is_active = True

                db.session.commit()

                # Log the user in automatically
                login_user(user)

                flash("تم إنشاء حسابك بنجاح!", "success")

                # Clear registration session
                for key in list(session.keys()):
                    if key.startswith('reg_') or key.startswith('registration_'):
                        session.pop(key, None)

                return redirect(url_for('auth.enterprise_complete'))

            except Exception as e:
                db.session.rollback()
                flash(f"حدث خطأ أثناء إنشاء الحساب: {e}", "error")
                return render_template("auth/register_flow.html")


@auth_bp.route("/verify-otp", methods=["GET", "POST"])
def verify_otp():
    """
    OTP verification page - Step 2 of registration.
    """
    if request.method == "GET":
        # Verify user has completed step 1
        if not session.get('registration_step2'):
            return redirect(url_for('auth.register_flow'))
        return render_template("auth/verify_otp.html")

    if request.method == "POST":
        # OTP verification - use combined OTP from hidden input
        otp = request.form.get('otp_combined', request.form.get('otp', '')).strip()
        stored_otp = session.get('reg_otp')

        if not stored_otp:
            flash("الرمز غير صالح. يرجى طلب رمز جديد.", "error")
            return redirect(url_for('auth.register_flow'))

        if otp != stored_otp.get('code', ''):
            flash("رمز التحقق غير صحيح", "error")
            return render_template("auth/verify_otp.html")

        # Check if OTP is still valid (10 minutes)
        expires_at_str = stored_otp.get('expires_at')
        if expires_at_str:
            try:
                expires_at = datetime.fromisoformat(expires_at_str)
                if datetime.utcnow() > expires_at:
                    flash("انتهت صلاحية رمز التحقق. يرجى طلب رمز جديد.", "error")
                    return render_template("auth/verify_otp.html")
            except (ValueError, TypeError):
                flash("الرمز غير صالح. يرجى طلب رمز جديد.", "error")
                return redirect(url_for('auth.register_personal'))

        # Proceed to step 2 (company info)
        session['registration_step3'] = True

        flash("تم التحقق من بريدك الإلكتروني", "success")
        return redirect(url_for('auth.register_flow'))


@auth_bp.route("/resend-enterprise-otp", methods=["POST"])
def resend_enterprise_otp():
    """
    Resend OTP email.
    """
    email = session.get('reg_email', '')
    full_name = session.get('reg_full_name', '')

    if not email:
        flash("يرجى بدء التسجيل من جديد", "error")
        return redirect(url_for('auth.register_flow'))

    # Generate new OTP
    otp = generate_otp()
    expires_at = generate_expires_at()

    session['reg_otp'] = {
        'code': otp,
        'expires_at': expires_at.isoformat()
    }

    try:
        if send_otp_email_en(email, otp, full_name):
            flash("تم إعادة إرسال رمز التحقق إلى بريدك الإلكتروني", "success")
        else:
            flash("فشل إرسال رمز التحقق. يرجى المحاولة لاحقاً.", "error")
    except Exception as e:
        flash(f"حدث خطأ أثناء إرسال رمز التحقق: {e}", "error")

    return redirect(url_for('auth.verify_otp'))


@auth_bp.route("/enterprise-complete", methods=["GET"])
def enterprise_complete():
    """
    Registration completion page - Step 3/Success page.
    """
    # Verify user has completed step 2
    if not session.get('registration_step3'):
        return redirect(url_for('auth.register_flow'))

    return render_template("auth/complete_registration.html")
