"""Image serving routes with optional access control."""
import os
from flask import Blueprint, send_from_directory, current_app, abort
from app.utils.decorators import jwt_required

# Create images blueprint
images_bp = Blueprint('images', __name__, url_prefix='/images')


def get_upload_folder(folder_type: str) -> str:
    """
    Return absolute folder path for a given type ('houses' or 'cars').
    Adjusted for Windows/absolute paths.
    """
    # Project base is one level above 'app'
    base_dir = os.path.abspath(os.path.join(current_app.root_path, '..'))
    upload_folder = current_app.config.get('UPLOAD_FOLDER', 'static/uploads')
    folder_path = os.path.join(base_dir, upload_folder, folder_type)

    if not os.path.exists(folder_path):
        os.makedirs(folder_path, exist_ok=True)

    return folder_path


def serve_image(folder_type: str, filename: str):
    """Generic function to serve an image file."""
    folder_path = get_upload_folder(folder_type)
    file_path = os.path.join(folder_path, filename)

    if not os.path.exists(file_path):
        current_app.logger.warning(f"File not found: {file_path}")
        abort(404, description="Image not found")

    return send_from_directory(folder_path, filename)


# Public endpoints
@images_bp.route('/houses/<filename>', methods=['GET'])
def serve_house_image(filename: str):
    return serve_image('houses', filename)


@images_bp.route('/cars/<filename>', methods=['GET'])
def serve_car_image(filename: str):
    return serve_image('cars', filename)


# Protected endpoints
@images_bp.route('/private/houses/<filename>', methods=['GET'])
@jwt_required
def serve_private_house_image(filename: str):
    return serve_image('houses', filename)


@images_bp.route('/private/cars/<filename>', methods=['GET'])
@jwt_required
def serve_private_car_image(filename: str):
    return serve_image('cars', filename)

@images_bp.route('/profile/<filename>', methods=['GET'])
def serve_profile_image(filename: str):
    return serve_image('profiles', filename)