from flask import Blueprint, render_template, request, redirect, url_for, flash
from controllers.auth_controller import login_required, admin_required
from models.project_model import ProjectModel
from models.survey_model import SurveyModel
from models.temperament_model import TemperamentModel
from models.report_model import ReportModel
from models.people_model import PeopleModel
from utils.i18n import t

project_bp = Blueprint('project', __name__)

@project_bp.route('/')
@login_required
def index():
    projects = ProjectModel.get_all_projects()
    return render_template('projects/index.html', projects=projects)

@project_bp.route('/create', methods=['GET', 'POST'])
@login_required
@admin_required
def create():
    if request.method == 'POST':
        name = request.form.get('name')
        slug = request.form.get('slug')
        survey_id = request.form.get('survey_id')
        start_date = request.form.get('start_date') or None
        end_date = request.form.get('end_date') or None
        show_results = request.form.get('show_results', 'show_by_admin')

        if not name:
            flash(t('messages.name_required', 'Name is required'), 'error')
            return render_template('projects/create.html', surveys=SurveyModel.get_all_surveys())

        ProjectModel.create_project(name, slug, survey_id, start_date, end_date, show_results)
        flash(t('messages.project_created', 'Project created successfully!'), 'success')
        return redirect(url_for('project.index'))
    
    surveys = SurveyModel.get_all_surveys()
    return render_template('projects/create.html', surveys=surveys)

@project_bp.route('/edit/<int:project_id>', methods=['GET', 'POST'])
@login_required
@admin_required
def edit(project_id):
    project = ProjectModel.get_project_by_id(project_id)
    if not project:
        flash(t('messages.project_not_found', 'Project not found'), 'error')
        return redirect(url_for('project.index'))
    
    if request.method == 'POST':
        name = request.form.get('name')
        slug = request.form.get('slug')
        survey_id = request.form.get('survey_id')
        start_date = request.form.get('start_date') or None
        end_date = request.form.get('end_date') or None
        show_results = request.form.get('show_results', 'show_by_admin')

        if not name:
            flash(t('messages.name_required', 'Name is required'), 'error')
            return render_template('projects/edit.html', project=project, surveys=SurveyModel.get_all_surveys())

        ProjectModel.update_project(project_id, name, slug, survey_id, start_date, end_date, show_results)
        flash(t('messages.project_updated', 'Project updated successfully!'), 'success')
        return redirect(url_for('project.index'))
    
    surveys = SurveyModel.get_all_surveys()
    return render_template('projects/edit.html', project=project, surveys=surveys)

@project_bp.route('/delete/<int:project_id>')
@login_required
@admin_required
def delete(project_id):
    project = ProjectModel.get_project_by_id(project_id)
    if not project:
        flash(t('messages.project_not_found', 'Project not found'), 'error')
        return redirect(url_for('project.index'))
    
    ProjectModel.delete_project(project_id)
    flash(t('messages.project_deleted', 'Project deleted successfully!'), 'success')
    return redirect(url_for('project.index'))

@project_bp.route('/results/<int:project_id>')
@login_required
def results(project_id):
    project = ProjectModel.get_project_by_id(project_id)
    if not project:
        flash(t('messages.project_not_found', 'Project not found'), 'error')
        return redirect(url_for('project.index'))

    # Fetch base data
    people = PeopleModel.get_people_by_project(project_id)
    temps = TemperamentModel.get_all_temperaments()

    # Enforce order Sanguine, Choleric, Melancholic, Phlegmatic if present
    preferred_order = ['Sanguine', 'Choleric', 'Melancholic', 'Phlegmatic']
    temps_sorted = sorted(temps, key=lambda t: preferred_order.index(t['name']) if t['name'] in preferred_order else 999)

    # Aggregate counts per person per temperament
    rows = ReportModel.get_project_temperament_counts(project_id)

    # Build mapping: person_id -> { temperament_id: count }
    per_person = {}
    for r in rows:
        pid = r['people_id']
        if pid not in per_person:
            per_person[pid] = {
                'name': r['people_name'],
                'scores': {}
            }
        per_person[pid]['scores'][r['temperament_id']] = r['cnt']

    # Get recommendations for each person
    recommendations = {}
    for person in people:
        rec = ReportModel.find_matching_recommendation(person['id'])
        if rec:
            recommendations[person['id']] = rec

    # Calculate group recommendation (most common dominant temperament)
    group_recommendation = None
    if people:
        # Get dominant temperament for each person
        dominant_temps = []
        for person in people:
            person_scores = per_person.get(person['id'], {}).get('scores', {})
            if person_scores:
                # Find temperament with highest score
                max_temp_id = max(person_scores, key=person_scores.get)
                dominant_temps.append(max_temp_id)

        # Find most common dominant temperament
        if dominant_temps:
            from collections import Counter
            most_common = Counter(dominant_temps).most_common(1)[0][0]
            # Find recommendation for this dominant temperament pattern
            # For group, we'll find a recommendation that starts with this temperament
            from models.recommendation_model import RecommendationModel
            all_recommendations = RecommendationModel.get_all_recommendations()
            for rec in all_recommendations:
                temp_order = rec.get('temperaments_orders', [])
                if temp_order and temp_order[0] == most_common:
                    group_recommendation = rec
                    break

    return render_template(
        'projects/results.html',
        project=project,
        people=people,
        temps=temps_sorted,
        per_person=per_person,
        recommendations=recommendations,
        group_recommendation=group_recommendation
    )
