from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify
from flask_login import login_required, current_user
from app.models import Job
from app import db
import json

jobs_bp = Blueprint('jobs', __name__, url_prefix='/jobs')

@jobs_bp.route('/submit')
@login_required
def submit():
    return render_template('jobs/submit.html')

@jobs_bp.route('/submit/step1', methods=['POST'])
@login_required
def submit_step1():
    branch_name = request.form.get('branch_name')
    # TODO: Implement branch checkout and scenario detection
    # For now, return mock scenarios
    scenarios = [
        'Scenario_1_Basic_Test',
        'Scenario_2_Advanced_Test',
        'Scenario_3_Integration_Test',
        'Scenario_4_Performance_Test',
        'Scenario_5_Security_Test'
    ]
    return render_template('jobs/submit_step2.html', branch_name=branch_name, scenarios=scenarios)

@jobs_bp.route('/submit/step2', methods=['POST'])
@login_required
def submit_step2():
    branch_name = request.form.get('branch_name')
    selected_scenarios = request.form.getlist('scenarios')
    
    if not selected_scenarios:
        flash('Please select at least one scenario', 'error')
        return redirect(url_for('jobs.submit'))
    
    return render_template('jobs/submit_step3.html', 
                         branch_name=branch_name, 
                         scenarios=selected_scenarios)

@jobs_bp.route('/submit/step3', methods=['POST'])
@login_required
def submit_step3():
    branch_name = request.form.get('branch_name')
    scenarios = request.form.get('scenarios')
    environment = request.form.get('environment')
    
    return render_template('jobs/submit_step4.html',
                         branch_name=branch_name,
                         scenarios=scenarios,
                         environment=environment)

@jobs_bp.route('/submit/final', methods=['POST'])
@login_required
def submit_final():
    branch_name = request.form.get('branch_name')
    scenarios = request.form.get('scenarios')
    environment = request.form.get('environment')
    test_mode = request.form.get('test_mode')
    keep_devbenches = request.form.get('keep_devbenches') == 'on'
    reuse_results = request.form.get('reuse_results') == 'on'
    
    job = Job(
        user_id=current_user.id,
        branch_name=branch_name,
        scenarios=scenarios,
        environment=environment,
        test_mode=test_mode,
        keep_devbenches=keep_devbenches,
        reuse_results=reuse_results,
        status='in_progress'
    )
    
    db.session.add(job)
    db.session.commit()
    
    # TODO: Start test execution in background
    
    flash('Test job submitted successfully', 'success')
    return redirect(url_for('dashboard.index'))

@jobs_bp.route('/<int:job_id>')
@login_required
def view_job(job_id):
    job = Job.query.get_or_404(job_id)
    
    if not current_user.is_admin and job.user_id != current_user.id:
        flash('Access denied', 'error')
        return redirect(url_for('dashboard.index'))
    
    return jsonify({
        'id': job.id,
        'submitter': job.submitter.username,
        'branch_name': job.branch_name,
        'scenarios': job.scenarios,
        'environment': job.environment,
        'test_mode': job.test_mode,
        'status': job.status,
        'submitted_at': job.submitted_at.strftime('%Y-%m-%d %H:%M:%S'),
        'completed_at': job.completed_at.strftime('%Y-%m-%d %H:%M:%S') if job.completed_at else None,
        'duration': job.duration,
        'keep_devbenches': job.keep_devbenches,
        'reuse_results': job.reuse_results,
        'results_path': job.results_path
    })

@jobs_bp.route('/<int:job_id>/abort', methods=['POST'])
@login_required
def abort_job(job_id):
    job = Job.query.get_or_404(job_id)
    
    if not current_user.is_admin and job.user_id != current_user.id:
        return jsonify({'error': 'Access denied'}), 403
    
    if job.status == 'in_progress':
        job.status = 'aborted'
        db.session.commit()
        # TODO: Kill the running process
        return jsonify({'success': True})
    
    return jsonify({'error': 'Job is not in progress'}), 400
