from flask import Blueprint, render_template, request, flash, redirect, url_for, current_app
from models.settings_model import SettingsModel
from controllers.auth_controller import admin_required
from werkzeug.utils import secure_filename
import os

settings_bp = Blueprint('settings', __name__, url_prefix='/settings')

ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'}

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@settings_bp.route('/general', methods=['GET', 'POST'])
@admin_required
def general():
    """General settings page"""
    if request.method == 'POST':
        title = request.form.get('title', '').strip()
        description = request.form.get('description', '').strip()
        tags = request.form.get('tags', '').strip()
        time_zone = request.form.get('time_zone', 'America/New_York').strip()
        remove_logo = request.form.get('remove_logo', '0') == '1'

        # Validation
        if not title:
            flash('Title is required', 'error')
            return redirect(url_for('settings.general'))

        if not time_zone:
            flash('Time zone is required', 'error')
            return redirect(url_for('settings.general'))

        # Get current settings to preserve logo if not changing
        current_settings = SettingsModel.get_settings()
        logo_path = current_settings.get('logo') if current_settings else None

        # Handle logo removal
        if remove_logo and logo_path:
            # Delete old logo file
            old_logo_full_path = os.path.join(current_app.root_path, 'static', logo_path)
            if os.path.exists(old_logo_full_path):
                try:
                    os.remove(old_logo_full_path)
                except:
                    pass
            logo_path = None

        # Handle logo upload
        if 'logo' in request.files:
            file = request.files['logo']
            if file and file.filename and allowed_file(file.filename):
                # Delete old logo if exists
                if logo_path and not remove_logo:
                    old_logo_full_path = os.path.join(current_app.root_path, 'static', logo_path)
                    if os.path.exists(old_logo_full_path):
                        try:
                            os.remove(old_logo_full_path)
                        except:
                            pass

                # Save new logo
                filename = secure_filename(file.filename)
                # Add timestamp to avoid caching issues
                import time
                filename = f"{int(time.time())}_{filename}"
                upload_folder = os.path.join(current_app.root_path, 'static', 'uploads', 'logos')
                os.makedirs(upload_folder, exist_ok=True)
                file_path = os.path.join(upload_folder, filename)
                file.save(file_path)
                logo_path = f"uploads/logos/{filename}"

        # Update settings
        try:
            SettingsModel.update_settings(title, logo_path, description, tags, time_zone)
            flash('settings_updated', 'success')
        except Exception as e:
            flash(f'Error updating settings: {str(e)}', 'error')

        return redirect(url_for('settings.general'))

    # GET request
    settings = SettingsModel.get_settings()

    # Common timezones
    timezones = [
        'America/New_York',
        'America/Chicago',
        'America/Denver',
        'America/Los_Angeles',
        'America/Mexico_City',
        'America/Bogota',
        'America/Lima',
        'America/Caracas',
        'America/Santiago',
        'America/Sao_Paulo',
        'Europe/London',
        'Europe/Paris',
        'Europe/Madrid',
        'Europe/Berlin',
        'Asia/Tokyo',
        'Asia/Shanghai',
        'Australia/Sydney',
        'UTC'
    ]

    return render_template('settings/general.html', settings=settings, timezones=timezones)
