from flask import Blueprint, render_template, request, redirect, url_for, flash
from controllers.auth_controller import login_required, admin_required
from models.feature_model import FeatureModel
from models.survey_model import SurveyModel
from models.question_model import QuestionModel
from models.option_model import OptionModel
from utils.i18n import t

feature_bp = Blueprint('feature', __name__)

@feature_bp.route('/')
@login_required
def index():
    features = FeatureModel.get_all_features()
    return render_template('features/index.html', features=features)

@feature_bp.route('/create', methods=['GET', 'POST'])
@login_required
@admin_required
def create():
    if request.method == 'POST':
        name = request.form.get('name')
        survey_id = request.form.get('survey_id')
        position = request.form.get('position', 1)
        
        if not name or not survey_id:
            flash(t('messages.name_survey_required', 'Name and survey are required'), 'error')
            return render_template('features/create.html', surveys=SurveyModel.get_all_surveys())
        
        FeatureModel.create_feature(survey_id, name, position)
        flash(t('messages.feature_created', 'Feature created successfully!'), 'success')
        return redirect(url_for('feature.index'))
    
    surveys = SurveyModel.get_all_surveys()
    return render_template('features/create.html', surveys=surveys)

@feature_bp.route('/edit/<int:feature_id>', methods=['GET', 'POST'])
@login_required
@admin_required
def edit(feature_id):
    feature = FeatureModel.get_feature_by_id(feature_id)
    if not feature:
        flash(t('messages.feature_not_found', 'Feature not found'), 'error')
        return redirect(url_for('feature.index'))
    
    if request.method == 'POST':
        name = request.form.get('name')
        survey_id = request.form.get('survey_id')
        position = request.form.get('position', 1)
        
        if not name or not survey_id:
            flash(t('messages.name_survey_required', 'Name and survey are required'), 'error')
            return render_template('features/edit.html', feature=feature, surveys=SurveyModel.get_all_surveys())
        
        FeatureModel.update_feature(feature_id, survey_id, name, position)
        flash(t('messages.feature_updated', 'Feature updated successfully!'), 'success')
        return redirect(url_for('feature.index'))
    
    surveys = SurveyModel.get_all_surveys()
    return render_template('features/edit.html', feature=feature, surveys=surveys)

@feature_bp.route('/delete/<int:feature_id>')
@login_required
@admin_required
def delete(feature_id):
    feature = FeatureModel.get_feature_by_id(feature_id)
    if not feature:
        flash(t('messages.feature_not_found', 'Feature not found'), 'error')
        return redirect(url_for('feature.index'))
    
    FeatureModel.delete_feature(feature_id)
    flash(t('messages.feature_deleted', 'Feature deleted successfully!'), 'success')
    return redirect(url_for('feature.index'))

@feature_bp.route('/manage-questions/<int:feature_id>')
@login_required
@admin_required
def manage_questions(feature_id):
    feature = FeatureModel.get_feature_by_id(feature_id)
    if not feature:
        flash(t('messages.feature_not_found', 'Feature not found'), 'error')
        return redirect(url_for('feature.index'))
    
    questions = QuestionModel.get_questions_by_feature(feature_id)
    options = OptionModel.get_all_options()
    options_count = len(options)
    
    return render_template('features/manage_questions.html', 
                         feature=feature, questions=questions, 
                         options=options, options_count=options_count)


@feature_bp.route('/add-question/<int:feature_id>', methods=['POST'])
@login_required
@admin_required
def add_question(feature_id):
    feature = FeatureModel.get_feature_by_id(feature_id)
    if not feature:
        flash('Feature not found', 'error')
        return redirect(url_for('feature.index'))
    
    name = request.form.get('name')
    if not name:
        flash(t('messages.question_name_required', 'Question name is required'), 'error')
        return redirect(url_for('feature.manage_questions', feature_id=feature_id))
    
    QuestionModel.create_question(name, feature_id)
    flash(t('messages.question_added', 'Question added successfully!'), 'success')
    return redirect(url_for('feature.manage_questions', feature_id=feature_id))

@feature_bp.route('/add-multiple-questions/<int:feature_id>', methods=['POST'])
@login_required
@admin_required
def add_multiple_questions(feature_id):
    feature = FeatureModel.get_feature_by_id(feature_id)
    if not feature:
        flash(t('messages.feature_not_found', 'Feature not found'), 'error')
        return redirect(url_for('feature.index'))
    
    # Get all options ordered by position
    options = OptionModel.get_all_options()
    questions_added = 0
    
    # Process each question based on options
    for option in options:
        question_key = f'question_{option["id"]}'
        question_name = request.form.get(question_key)
        
        if question_name and question_name.strip():
            # Link question to this option to preserve ordering by options
            QuestionModel.create_question(question_name.strip(), feature_id, option_id=option['id'])
            questions_added += 1
    
    if questions_added > 0:
        msg = t('messages.questions_added', '{count} questions added successfully!').format(count=questions_added)
        flash(msg, 'success')
    else:
        flash(t('messages.no_questions_added', 'No questions were added. Please fill at least one question field.'), 'warning')
    
    return redirect(url_for('feature.manage_questions', feature_id=feature_id))

@feature_bp.route('/edit-question/<int:feature_id>/<int:question_id>', methods=['POST'])
@login_required
@admin_required
def edit_question(feature_id, question_id):
    feature = FeatureModel.get_feature_by_id(feature_id)
    question = QuestionModel.get_question_by_id(question_id)
    
    if not feature or not question:
        flash(t('messages.feature_or_question_not_found', 'Feature or question not found'), 'error')
        return redirect(url_for('feature.index'))
    
    name = request.form.get('name')
    option_id = request.form.get('option_id') or None
    if not name:
        flash(t('messages.question_name_required', 'Question name is required'), 'error')
        return redirect(url_for('feature.manage_questions', feature_id=feature_id))
    
    QuestionModel.update_question(question_id, name, feature_id, option_id=int(option_id) if option_id else None)
    flash(t('messages.question_updated', 'Question updated successfully!'), 'success')
    return redirect(url_for('feature.manage_questions', feature_id=feature_id))

@feature_bp.route('/delete-question/<int:feature_id>/<int:question_id>')
@login_required
@admin_required
def delete_question(feature_id, question_id):
    feature = FeatureModel.get_feature_by_id(feature_id)
    question = QuestionModel.get_question_by_id(question_id)
    
    if not feature or not question:
        flash(t('messages.feature_or_question_not_found', 'Feature or question not found'), 'error')
        return redirect(url_for('feature.index'))
    
    QuestionModel.delete_question(question_id)
    flash(t('messages.question_deleted', 'Question deleted successfully!'), 'success')
    return redirect(url_for('feature.manage_questions', feature_id=feature_id))
