import os
from flask import Blueprint, render_template, request, redirect, url_for, flash, send_file
from . import db
from .models import Client, Provision
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.utils import secure_filename
from .allocai import process_allocai_csv  # We'll make allocai.py into a function

client_bp = Blueprint('client', __name__)
UPLOAD_FOLDER = os.path.join(os.getcwd(), 'uploads')
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

@client_bp.route('/client/login', methods=['GET', 'POST'])
def client_login():
    if request.method == 'POST':
        email = request.form.get('email').strip().lower()

        client = Client.query.filter_by(email=email).first()
        provision = Provision.query.filter_by(email=email).first()

        if client:
            # Existing client, go to password login page
            resp = redirect(url_for('client.password_login', email=email))
            return resp

        elif provision:
            # Provisioned but not yet a client — go to setup page
            resp = redirect(url_for('client.setup_account', email=email))
            return resp

        else:
            # Invite flow — create new client directly
            # Email not found anywhere
            flash("Email not found in system", 'danger')
            return render_template('client_login1.html')

    return render_template('client_login1.html')

@client_bp.route('/client/logout')
def client_logout():
    resp = redirect(url_for('client.client_login'))
    # Clear cookies by setting them to empty with expiration in past
    resp.set_cookie('client_email', '', expires=0)
    resp.set_cookie('client_firstname', '', expires=0)
    resp.set_cookie('client_lastname', '', expires=0)
    resp.set_cookie('client_features', '', expires=0)
    flash("You have been logged out successfully.", "success")
    return resp

@client_bp.route('/client/setup', methods=['GET', 'POST'])
def setup_account():
    email = request.args.get('email')
    if request.method == 'POST':
        password = request.form.get('password')
        confirm = request.form.get('confirmPassword')

        if password != confirm:
            flash("Passwords do not match", 'danger')
            return render_template('client_login_setup_page.html', email=email)

        hashed_pw = generate_password_hash(password, method="pbkdf2:sha256")
        provision = Provision.query.filter_by(email=email).first()
        first_name = provision.first_name
        last_name = provision.last_name
        provisioned =True
        features = provision.features
        new_client = Client(email=email, password=hashed_pw, first_name=first_name, last_name=last_name, provisioned=provisioned)
        db.session.add(new_client)
        db.session.commit()

        resp = redirect(url_for('client.copilotwelcome'))
        resp.set_cookie('client_email', email)
        resp.set_cookie('client_firstname', first_name)
        resp.set_cookie('client_lastname', last_name)
        resp.set_cookie('client_features', features)
        return resp

    return render_template('client_login_setup_page.html', email=email)


@client_bp.route('/client/password-login', methods=['GET', 'POST'])
def password_login():
    email = request.args.get('email')
    if request.method == 'POST':
        password = request.form.get('ClientPassword')
        client = Client.query.filter_by(email=email).first()
        provision = Provision.query.filter_by(email=email).first()
        if client and check_password_hash(client.password, password):
            resp = redirect(url_for('client.copilotwelcome'))
            resp.set_cookie('client_email', email)
            resp.set_cookie('client_firstname', client.first_name)
            resp.set_cookie('client_lastname', client.last_name)
            resp.set_cookie('client_features', provision.features)
            return resp
        else:
            flash("Invalid email or password")

    return render_template('client_login2.html', email=email)

@client_bp.route('/client/copilot')
def copilot():
    client_email = request.cookies.get('client_email')
    client_firstname = request.cookies.get('client_firstname')
    client_lastname = request.cookies.get('client_lastname')
    client_features = request.cookies.get('client_features')
    if not client_email:
        return redirect(url_for('client.client_login'))
    if not (client_features and "copilot" in client_features):
         return redirect(url_for('client.copilotwelcome'))      
    return render_template(
        'client_welcome_copilot.html',
        client_email=client_email,
        client_firstname=client_firstname,
        client_lastname=client_lastname,
        client_features=client_features

    )
@client_bp.route('/client/copilot_standalone')
def copilot_standalone():
    client_email = request.cookies.get('client_email')
    client_firstname = request.cookies.get('client_firstname')
    client_lastname = request.cookies.get('client_lastname')
    client_features = request.cookies.get('client_features')
    if not client_email:
        return redirect(url_for('client.client_login'))
    if not (client_features and "copilot" in client_features):
         return redirect(url_for('client.copilotwelcome'))    
    return render_template(
        'client_welcome_copilot2.html',
        client_email=client_email,
        client_firstname=client_firstname,
        client_lastname=client_lastname,
        client_features=client_features
    )       
@client_bp.route('/client/attribution', methods=['GET', 'POST'])
def attribution():
    client_email = request.cookies.get('client_email')
    client_firstname = request.cookies.get('client_firstname')
    client_lastname = request.cookies.get('client_lastname')
    client_features = request.cookies.get('client_features')
    if not client_email:
        return redirect(url_for('client.client_login'))
    if not (client_features and "attribution" in client_features):
         return redirect(url_for('client.copilotwelcome')) 
    if request.method == 'POST':
        file = request.files.get('csv-upload')
        if not file or file.filename == '':
            flash("Please upload a CSV file", "danger")
            return redirect(url_for('client.attribution'))

        filename = secure_filename(file.filename)
        input_path = os.path.join(UPLOAD_FOLDER, filename)
        file.save(input_path)
        model = request.form.get('model', 'FT')  # Default = First Touch
        # Process file using allocai.py logic
        output_filename = f"{model}_AttributionOutput_{filename}"
        output_path = os.path.join(UPLOAD_FOLDER, output_filename)
        process_allocai_csv(input_path, output_path,model=model)
        
        return {"download_url": url_for('client.download_attribution_file', filename=output_filename)}

        return send_file(output_path, as_attachment=True)

    return render_template(
        'client_welcome_attribution.html',
        client_email=client_email,
        client_firstname=client_firstname,
        client_lastname=client_lastname,
        client_features=client_features
    )
@client_bp.route('/client/copilotwelcome')
def copilotwelcome():
    client_email = request.cookies.get('client_email')
    client_firstname = request.cookies.get('client_firstname')
    client_lastname = request.cookies.get('client_lastname')
    client_features = request.cookies.get('client_features')
    if not client_email:
        return redirect(url_for('client.client_login'))
    return render_template(
        'client_welcome_copilot_page1.html',
        client_email=client_email,
        client_firstname=client_firstname,
        client_lastname=client_lastname,
        client_features=client_features
    )
@client_bp.route('/client/attribution/download/<filename>')
def download_attribution_file(filename):
    output_path = os.path.join(UPLOAD_FOLDER, filename)
    return send_file(output_path, as_attachment=True)
        
@client_bp.errorhandler(Exception)
def handle_client_errors(e):
    print(f"❌ Client route error: {e}")
    flash(f"❌ Something went wrong: {str(e)}", "danger")

    # Redirect back to the same page user was on
    return redirect(request.referrer or url_for("client.client_login"))
