from flask import Blueprint, request, Response
from app.services.images_services import (
    upload_images_service,
    download_images_service,
    delete_image_service,
    list_images_service,
    set_image_metadata_service,
    get_image_service,
    get_image_tag_options_service,
)
from app.core.security import require_jwt
from app.core.response import build_response


image_routes = Blueprint('image_routes', __name__)


# Upload images
@image_routes.route('/upload_images/<int:id>/', methods=['POST'])
@require_jwt()
def upload_images(id: int) -> Response:
    files = request.files

    response, status_codes = upload_images_service(files=files, id=id)
    return build_response(data=response,
                          status_codes=status_codes)


# Download images ZIP for a specific property
@image_routes.route('/download_images/<int:id>/', methods=['GET'])
@require_jwt()
def download_images(id: int) -> Response:
    response, status_codes = download_images_service(id=id)
    if isinstance(response, dict) and "error" in response:
        return build_response(data=response, status_codes=status_codes)

    return response


# Delete image by ID
@image_routes.route('/delete_image/<int:image_id>/', methods=['DELETE'])
@require_jwt()
def delete_image(image_id: int) -> Response:
    response, status_codes = delete_image_service(image_id=image_id)
    return build_response(data=response,
                          status_codes=status_codes)


# List images
@image_routes.route('/list_images/<int:id>/', methods=['GET'])
@require_jwt()
def list_images(id: int) -> Response:
    response, status_codes = list_images_service(id=id)
    return build_response(data=response,
                          status_codes=status_codes)


# List public images
@image_routes.route('/list_public_images/<int:id>/', methods=['GET'])
@require_jwt()
def list_public_images(id: int) -> Response:
    response, status_codes = list_images_service(id=id, watermark=True)
    return build_response(data=response,
                          status_codes=status_codes)


# Get public image
@image_routes.route('/get_public_image/<int:image_id>/', methods=['GET'])
def get_public_image(image_id: int) -> Response:
    use_thumbnail = request.args.get("thumbnail") == "true"

    response, status_codes = get_image_service(
        image_id=image_id, watermark=True, thumbnail=use_thumbnail)
    if isinstance(response, dict) and "error" in response:
        return build_response(data=response, status_codes=status_codes)

    return response


# Get tag options for images
@image_routes.route('/get_image_tag_options/<string:model_name>/',
                    methods=['GET'])
@require_jwt()
def get_image_tag_options(model_name: str) -> Response:
    response, status_codes = get_image_tag_options_service(
        model_name=model_name)
    return build_response(data=response,
                          status_codes=status_codes)


# Set tag and description for image
@image_routes.route('/set_image_metadata/<int:image_id>/', methods=['POST'])
@require_jwt()
def set_image_metadata(image_id: int) -> Response:
    data = request.json
    tag = data.get("tag")
    description = data.get("description")

    response, status_codes = set_image_metadata_service(
        image_id=image_id, tag=tag, description=description)
    return build_response(data=response,
                          status_codes=status_codes)
