from flask import render_template, redirect, url_for, flash, request, jsonify
from flask_login import login_required, current_user
from app.extensions import db
from app.blueprints.analysis import bp
from app.models.dataset import Dataset, DataPoint
from app.models.analysis import AnalysisType, AnalysisRun
from app.analyses.eligibility import get_eligible_analyses, compute_subset_stats


@bp.route('/datasets/<int:dataset_id>/analyze', methods=['GET', 'POST'])
@login_required
def select(dataset_id):
    dataset = Dataset.query.get_or_404(dataset_id)
    if dataset.user_id != current_user.id:
        flash('Access denied.', 'error')
        return redirect(url_for('datasets.list_datasets'))

    # Get subset filters from query params
    animal_ids = request.args.getlist('animals') or None
    time_start = request.args.get('time_start')
    time_end = request.args.get('time_end')

    subset_stats = compute_subset_stats(dataset.id, animal_ids, time_start, time_end)
    eligible = get_eligible_analyses(subset_stats)

    if request.method == 'POST':
        selected_slugs = request.form.getlist('analyses')
        if not selected_slugs:
            flash('Select at least one analysis.', 'error')
            return render_template('select.html', dataset=dataset,
                                   eligible=eligible, subset_stats=subset_stats)

        runs = []
        for slug in selected_slugs:
            atype = AnalysisType.query.filter_by(slug=slug).first()
            if not atype:
                continue
            run = AnalysisRun(
                user_id=current_user.id,
                dataset_id=dataset.id,
                analysis_type_id=atype.id,
                animal_ids=animal_ids,
                time_start=time_start,
                time_end=time_end,
                params=atype.default_params or {},
                status='queued',
            )
            db.session.add(run)
            runs.append(run)
        db.session.commit()

        # Submit to Celery
        from app.tasks.analysis_tasks import run_analysis
        for run in runs:
            task = run_analysis.delay(run.id)
            run.celery_task_id = task.id
        db.session.commit()

        if len(runs) == 1:
            return redirect(url_for('analysis.status', run_uuid=runs[0].uuid))
        return redirect(url_for('analysis.runs_list', dataset_id=dataset.id))

    return render_template('select.html', dataset=dataset,
                           eligible=eligible, subset_stats=subset_stats)


@bp.route('/analysis/<run_uuid>')
@login_required
def status(run_uuid):
    run = AnalysisRun.query.filter_by(uuid=run_uuid).first_or_404()
    if run.user_id != current_user.id:
        flash('Access denied.', 'error')
        return redirect(url_for('index'))
    return render_template('status.html', run=run)


@bp.route('/analysis/<run_uuid>/results')
@login_required
def results(run_uuid):
    run = AnalysisRun.query.filter_by(uuid=run_uuid).first_or_404()
    if run.user_id != current_user.id:
        flash('Access denied.', 'error')
        return redirect(url_for('index'))
    return render_template('results.html', run=run)


@bp.route('/datasets/<int:dataset_id>/runs')
@login_required
def runs_list(dataset_id):
    dataset = Dataset.query.get_or_404(dataset_id)
    if dataset.user_id != current_user.id:
        flash('Access denied.', 'error')
        return redirect(url_for('datasets.list_datasets'))
    runs = AnalysisRun.query.filter_by(dataset_id=dataset.id)\
        .order_by(AnalysisRun.created_at.desc()).all()
    return render_template('runs_list.html', dataset=dataset, runs=runs)
