import time
from flask import request, jsonify, Response, stream_with_context, render_template, redirect, url_for, session
from extensions import INDUSTRIAL_COPILOT
import services.Utils as Utils
from flask_babel import Babel, _ #pip install Flask-Babel
from services.locale_service import get_locale
from flask import Blueprint
from services import otp_service 
from services import auth_service

# IPPanel SMS Configuration

NOTIFY_NUMBER = "09135535119"
PATTERN_CODE_BOOKING = "h6e4xg7rfyific8"

# OpenAI API Key
SECOND_OPENAI_API_KEY = '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'


login_register_bp = Blueprint("login_register", __name__)



@login_register_bp.route('/register', methods=['POST', 'GET'], endpoint='register_page')
@auth_service.not_login_required('chatbot.chat_page')
def register_page():
    lang = get_locale()
    input_type_default = 'phone' if lang == 'fa' else 'email'
    
    if request.method == 'GET':
        return render_template('register.html', input_type=input_type_default)
    
@login_register_bp.route('/verify', endpoint='verify_page')
@auth_service.not_login_required('chatbot.chat_page')
def verify_page():
    return render_template("verify.html")

@login_register_bp.route('/logout', endpoint='logout')
@auth_service.login_required('chatbot.chat_page')
def logout():
    auth_service.logout_user()
    return redirect(url_for('login_register.register_page'))



@login_register_bp.route('/api/send-code', methods=['POST'], endpoint='generate_and_send_code')
@auth_service.not_login_required('chatbot.chat_page')
def generate_and_send_code():
    if request.method != 'POST':
        return 
    
    lang = get_locale()
    input_type_default = 'phone' if lang == 'fa' else 'email'
    
    # POST request
    data = request.get_json()
    contact_input = data.get('contact_input', '').strip()
    input_type = data.get('input_type', input_type_default)

    if not contact_input:
        msg = _('شماره تلفن را وارد کنید') if input_type == 'phone' else _('ایمیل را وارد کنید')
        return jsonify({'success': False, 'message': msg}), 400

    if input_type == 'phone':
        if not Utils.is_valid_phone_number(contact_input):
            return jsonify({
                'success': False,
                'message': _('شماره تلفن معتبر نیست. لطفاً شماره‌ای 11 رقمی وارد کنید.')
            }), 400
    else:
        if not Utils.is_valid_email(contact_input):
            return jsonify({
                'success': False,
                'message': _('ایمیل معتبر نیست. لطفاً یک ایمیل صحیح وارد کنید.')
            }), 400

    session['input_type'] = input_type
    session['contact_input'] = contact_input
    otp_code = otp_service.generate_and_store_otp()
    print("OTP_CODE:", otp_code)

    if input_type == 'phone':
        otp_service.send_otp_sms(contact_input, otp_code)
    else:

        otp_service.send_email_otp(email=contact_input,code=otp_code,language=lang)
    
    return jsonify({
        'success': True,
        'message': _('کد با موفقیت ارسال شد. در حال هدایت...')
    })
    


@login_register_bp.route('/api/verify_code', methods=['POST'], endpoint='verify_code')
@auth_service.not_login_required('chatbot.chat_page')
def verify_code(max_attempts=5):


    if INDUSTRIAL_COPILOT:
        redirect_url = url_for("factory_panel_app.factory_dashbaord")
    else:
        redirect_url = url_for("chatbot.chat_page")



    now = int(time.time())

    otp_code = str(request.json.get('otp_code'))
    

    if not otp_code:
        return jsonify({
                'success': False,
                'message': _('کد را وارد کنید')
            }), 400
    
    if 'otp_hmac' not in session:
        return jsonify({
                'success': False,
                'message': _('کدی یافت نشد، مجددا کد را دریافت کنید')
            }), 400

    if now > session.get('otp_expires_at', 0):
        session.pop('otp_hmac', None)
        return jsonify({
                'success': False,
                'message': _('کد منقضی شده است')
            }), 400
    
    session['otp_attempts'] = session.get('otp_attempts', 0) + 1
    
    if session['otp_attempts'] > max_attempts:
        session.pop('otp_hmac', None)
        return jsonify({
                'success': False,
                'message': _('تلاش نا موفق بسیار. لطفا کمی بعد امتحان کنید')
            }), 400
    
    if not otp_service.check_otp_is_valid(otp_code):
        return jsonify({
                'success': False,
                'message': _('کد نادرست است')
            }), 400
    else:
        otp_service.clear_otp_session()
        input_type = session.get('input_type')
        contact_input = session.get('contact_input')
        user = None
        if input_type == 'phone':
            user = auth_service.create_user_if_not_exists(email=None, phone=contact_input)
        else:
            user = auth_service.create_user_if_not_exists(email=contact_input, phone=None)

        auth_service.login_user(user)
        
        return jsonify({
                'success': True,
                'message': _('کد صحیح است'),
                'redirect_url' : redirect_url
            }), 200




