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


@bp.route('/datasets/<int:dataset_id>/points')
@login_required
def get_points(dataset_id):
    """Return data points as GeoJSON for map display."""
    dataset = Dataset.query.get_or_404(dataset_id)
    if dataset.user_id != current_user.id:
        return jsonify({'error': 'forbidden'}), 403

    # Optional filters
    animal_ids = request.args.getlist('animals')
    time_start = request.args.get('time_start')
    time_end = request.args.get('time_end')
    limit = min(int(request.args.get('limit', 10000)), 50000)

    q = DataPoint.query.filter_by(dataset_id=dataset.id)
    if animal_ids:
        q = q.filter(DataPoint.animal_id.in_(animal_ids))
    if time_start:
        q = q.filter(DataPoint.timestamp >= time_start)
    if time_end:
        q = q.filter(DataPoint.timestamp <= time_end)

    points = q.order_by(DataPoint.timestamp).limit(limit).all()

    features = []
    for p in points:
        features.append({
            'type': 'Feature',
            'geometry': {'type': 'Point', 'coordinates': [p.lon, p.lat]},
            'properties': {
                'animal_id': p.animal_id,
                'timestamp': p.timestamp.isoformat(),
                'speed': p.speed,
                'step_length': p.step_length,
            }
        })

    return jsonify({
        'type': 'FeatureCollection',
        'features': features,
    })


@bp.route('/datasets/<int:dataset_id>/subset-stats')
@login_required
def subset_stats(dataset_id):
    """Return statistics for a data subset (for eligibility checking)."""
    dataset = Dataset.query.get_or_404(dataset_id)
    if dataset.user_id != current_user.id:
        return jsonify({'error': 'forbidden'}), 403

    animal_ids = request.args.getlist('animals') or None
    time_start = request.args.get('time_start')
    time_end = request.args.get('time_end')

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

    return jsonify({
        'stats': stats,
        'eligible_analyses': [{'slug': a.slug, 'name': a.name,
                                'description': a.description, 'category': a.category}
                               for a in eligible],
    })


@bp.route('/runs/<run_uuid>/status')
@login_required
def run_status(run_uuid):
    """Poll analysis run status."""
    run = AnalysisRun.query.filter_by(uuid=run_uuid).first_or_404()
    if run.user_id != current_user.id:
        return jsonify({'error': 'forbidden'}), 403

    return jsonify({
        'status': run.status,
        'started_at': run.started_at.isoformat() if run.started_at else None,
        'completed_at': run.completed_at.isoformat() if run.completed_at else None,
        'error_message': run.error_message,
        'result_summary': run.result_summary,
    })
