import resp
from flask import render_template, redirect, url_for, flash, session, request, jsonify, current_app
from werkzeug.security import generate_password_hash, check_password_hash
from account import auth
from account.forms import RegisterForm, LoginForm
from account.model import add_user
from account.model import get_user_by_email_or_username  # Update import
from flask_dance.contrib.google import make_google_blueprint, google

google_bp = make_google_blueprint(scope=["profile", "email"])
user_info_cache = {}

@auth.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm()
    if form.validate_on_submit():
        user_data = {
            'first_name': form.first_name.data,
            'last_name': form.last_name.data,
            'username': form.username.data,
            'email': form.email.data,
            'password': generate_password_hash(form.password.data)
        }
        add_user(user_data, form.user_type.data)
        flash('Registered successfully!', 'success')
        return redirect(url_for('auth.login'))
    else:
        print("Form errors:", form.errors)
    return render_template('account/register.html', form=form)

@auth.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = get_user_by_email_or_username(form.email.data, form.user_type.data)
        if user and check_password_hash(user['password'], form.password.data):
            session['user_id'] = str(user['_id'])  # ✅ Correct session key
            session['user_type'] = form.user_type.data  # ✅ Correct session key

            print("🧠 session user_id:", session.get('user_id'))

            flash('Logged in successfully!', 'success')
            session['clear_compare'] = True
            if form.user_type.data == 'seller':
                return redirect(url_for('seller.home'))
            else:
                return redirect(url_for('main.homepage'))

        flash('Invalid credentials', 'danger')
    return render_template('account/login.html', form=form)


@auth.route('/login/google/<user_type>')
def google_login(user_type):
    if not google.authorized:
        session['temp_type'] = user_type
        return redirect(url_for('google.login'))

    resp = google.get("/oauth2/v2/userinfo")
    if not resp.ok:
        flash("Google login failed.", "danger")
        return redirect(url_for("auth.login"))

    user_info = resp.json()
    email = user_info['email']
    session['google_user'] = email

    user = get_user_by_email_or_username(email, user_type)
    if not user:
        user_data = {
            'first_name': user_info.get('given_name', ''),
            'last_name': user_info.get('family_name', ''),
            'username': email.split('@')[0],
            'email': email,
            'password': '',  # Google handles auth
            'avatar': user_info.get('picture', '')
        }
        add_user(user_data, user_type)

    user = get_user_by_email_or_username(email, user_type)

    # ✅ Update avatar if it's missing (for existing Google users)
    if not user.get('avatar') and user_info.get('picture'):
        current_app.db['Users'].update_one(
            {'_id': user['_id']},
            {'$set': {'avatar': user_info['picture']}}
        )
        # 🔄 Refresh the user document from the DB to get the updated avatar
        user = get_user_by_email_or_username(email, user_type)

    # ✅ Set session info
    session['user_id'] = str(user['_id'])
    session['user_type'] = user_type
    session['clear_compare'] = True

    if user_type == 'seller':
        return redirect(url_for('seller.home'))
    else:
        return redirect(url_for('main.homepage'))



@auth.route("/google/complete")
def google_complete():
    user_type = session.get("temp_type", "user")
    return redirect(url_for("auth.google_login", user_type=user_type))


@auth.route('/logout')
def logout():
    session.clear()
    flash("Logged out", "info")
    return redirect(url_for("auth.login"))




@auth.route('/should_clear_compare')
def should_clear_compare():
    return jsonify({'clear': session.get('clear_compare', False)})

@auth.route('/clear_compare_flag', methods=['POST'])
def clear_compare_flag():
    session.pop('clear_compare', None)
    return '', 204



