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

survey_bp = Blueprint('survey', __name__)

@survey_bp.route('/')
@login_required
def index():
    surveys = SurveyModel.get_all_surveys()
    
    # Add counts for each survey
    for survey in surveys:
        survey['features_count'] = SurveyModel.get_survey_features_count(survey['id'])
        survey['questions_count'] = SurveyModel.get_survey_questions_count(survey['id'])
    
    return render_template('surveys/index.html', surveys=surveys)

@survey_bp.route('/create', methods=['GET', 'POST'])
@login_required
@admin_required
def create():
    if request.method == 'POST':
        name = request.form.get('name')
        is_active = request.form.get('is_active') == 'on'
        
        if not name:
            flash(t('messages.name_required', 'Name is required'), 'error')
            return render_template('surveys/create.html')
        
        SurveyModel.create_survey(name, is_active)
        flash(t('messages.survey_created', 'Survey created successfully!'), 'success')
        return redirect(url_for('survey.index'))
    
    return render_template('surveys/create.html')

@survey_bp.route('/edit/<int:survey_id>', methods=['GET', 'POST'])
@login_required
@admin_required
def edit(survey_id):
    survey = SurveyModel.get_survey_by_id(survey_id)
    if not survey:
        flash(t('messages.survey_not_found', 'Survey not found'), 'error')
        return redirect(url_for('survey.index'))
    
    if request.method == 'POST':
        name = request.form.get('name')
        is_active = request.form.get('is_active') == 'on'
        
        if not name:
            flash(t('messages.name_required', 'Name is required'), 'error')
            return render_template('surveys/edit.html', survey=survey)
        
        SurveyModel.update_survey(survey_id, name, is_active)
        flash(t('messages.survey_updated', 'Survey updated successfully!'), 'success')
        return redirect(url_for('survey.index'))
    
    return render_template('surveys/edit.html', survey=survey)

@survey_bp.route('/delete/<int:survey_id>')
@login_required
@admin_required
def delete(survey_id):
    survey = SurveyModel.get_survey_by_id(survey_id)
    if not survey:
        flash(t('messages.survey_not_found', 'Survey not found'), 'error')
        return redirect(url_for('survey.index'))
    
    SurveyModel.delete_survey(survey_id)
    flash(t('messages.survey_deleted', 'Survey deleted successfully!'), 'success')
    return redirect(url_for('survey.index'))

@survey_bp.route('/manage-features/<int:survey_id>')
@login_required
@admin_required
def manage_features(survey_id):
    survey = SurveyModel.get_survey_by_id(survey_id)
    if not survey:
        flash(t('messages.survey_not_found', 'Survey not found'), 'error')
        return redirect(url_for('survey.index'))
    
    features = FeatureModel.get_features_by_survey(survey_id)
    # Add question count for each feature
    for feature in features:
        feature['questions_count'] = FeatureModel.get_feature_questions_count(feature['id'])
    
    return render_template('surveys/manage_features.html', survey=survey, features=features)

@survey_bp.route('/add-feature/<int:survey_id>', methods=['POST'])
@login_required
@admin_required
def add_feature(survey_id):
    survey = SurveyModel.get_survey_by_id(survey_id)
    if not survey:
        flash(t('messages.survey_not_found', 'Survey not found'), 'error')
        return redirect(url_for('survey.index'))
    
    name = request.form.get('name')
    position = request.form.get('position', type=int)
    
    if not name or not position:
        flash(t('messages.name_position_required', 'Name and position are required'), 'error')
        return redirect(url_for('survey.manage_features', survey_id=survey_id))
    
    FeatureModel.create_feature(survey_id, name, position)
    flash(t('messages.feature_added', 'Feature added successfully!'), 'success')
    return redirect(url_for('survey.manage_features', survey_id=survey_id))

@survey_bp.route('/edit-feature/<int:survey_id>/<int:feature_id>', methods=['POST'])
@login_required
@admin_required
def edit_feature(survey_id, feature_id):
    survey = SurveyModel.get_survey_by_id(survey_id)
    feature = FeatureModel.get_feature_by_id(feature_id)
    
    if not survey or not feature:
        flash(t('messages.survey_or_feature_not_found', 'Survey or feature not found'), 'error')
        return redirect(url_for('survey.index'))
    
    name = request.form.get('name')
    position = request.form.get('position', type=int)
    
    if not name or not position:
        flash(t('messages.name_position_required', 'Name and position are required'), 'error')
        return redirect(url_for('survey.manage_features', survey_id=survey_id))
    
    FeatureModel.update_feature(feature_id, survey_id, name, position)
    flash(t('messages.feature_updated', 'Feature updated successfully!'), 'success')
    return redirect(url_for('survey.manage_features', survey_id=survey_id))

@survey_bp.route('/delete-feature/<int:survey_id>/<int:feature_id>')
@login_required
@admin_required
def delete_feature(survey_id, feature_id):
    survey = SurveyModel.get_survey_by_id(survey_id)
    feature = FeatureModel.get_feature_by_id(feature_id)
    
    if not survey or not feature:
        flash(t('messages.survey_or_feature_not_found', 'Survey or feature not found'), 'error')
        return redirect(url_for('survey.index'))
    
    FeatureModel.delete_feature(feature_id)
    flash(t('messages.feature_deleted', 'Feature deleted successfully!'), 'success')
    return redirect(url_for('survey.manage_features', survey_id=survey_id))
