from flask import Blueprint, request, jsonify ,current_app
from werkzeug.security import generate_password_hash, check_password_hash
from flask_jwt_extended import jwt_required
from ..auth.utils import generate_custom_token
# from flask import current_app
#
# query_results = current_app.query_results
auth_bp = Blueprint('auth', __name__)
# database = Database(commit=True)
# current_app.query_results = QueryResults(database)

@auth_bp.route('/signup', methods=['POST'])
def signup():
    data = request.get_json()
    name = data.get('name')
    email = data.get('email')
    password = generate_password_hash(data.get('password'))

    # Check if email already exists
    check_query = {
        'statement': "SELECT * FROM users WHERE {} = %s",
        'params': (email,),
        'column_name':('email',)
    }
    query_results = current_app.extensions['query_results']
    existing_user = query_results.fetch_query_results(**check_query)
    if existing_user:
        return jsonify(success=False, error="Email already exists", code="EMAIL_EXISTS"), 400

    # Insert user
    insert_query = {
        'statement': "INSERT INTO users (name, email, password) VALUES (%s, %s, %s)",
        'params': (name, email, password)
    }
    user_id = query_results.insertion(commit=True, **insert_query)

    token = generate_custom_token(user_id, exp_days=7)

    return jsonify(success=True, token=token, user={
        "id": user_id,
        "name": name,
        "email": email,
        "hasInverter": False
    })

@auth_bp.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    email = data.get('email')
    password = data.get('password')

    # Get user by email
    select_query = {
        'statement': "SELECT * FROM users WHERE email = %s",
        "column_name":('email',) ,
        'params': (email,)
    }
    query_results = current_app.extensions['query_results']
    user_result = query_results.fetch_query_results(**select_query)

    if not user_result:
        return jsonify(success=False, error="Invalid credentials", code="INVALID_LOGIN"), 401

    user = user_result[0]

    if not check_password_hash(user['password'], password):
        return jsonify(success=False, error="Invalid credentials", code="INVALID_LOGIN"), 401

    token = generate_custom_token(user['id'], exp_days=7)

    select_inverter_query = {
        'statement': "SELECT * FROM inverter_details WHERE {} = %s",
        "column_name": ('user_id',),
        'params': (user['id'],)
    }
    inverter_details = query_results.fetch_query_results(**select_inverter_query)
    has_inverter = True if inverter_details else False

    return jsonify(success=True, token=token, user={
        "id": user['id'],
        "name": user['name'],
        "email": user['email'],
        "hasInverter": has_inverter
    })

@auth_bp.route('/logout', methods=['POST'])
@jwt_required()
def logout():
    return jsonify(success=True, message="Logged out successfully")
