from flask import Blueprint, request
from controllers.glb_controller import GlbController
from controllers.render_controller import RenderController
from controllers.suggest_controller import SuggestController

glb_bp = Blueprint('glb', __name__)
render_bp = Blueprint('render', __name__)
suggest_bp = Blueprint('suggest', __name__)

glb_controller = GlbController()
render_controller = RenderController()
suggest_controller = SuggestController()

def setup_routes(app):    
    @app.route('/glb', methods=['GET'])
    # Image to model
    def get_glb():
        base_image_url = request.args.get('base_image_url', type=str)
        hf_token = request.args.get('hf_token', '', type=str)
        ss_guidance_strength = request.args.get('ss_guidance_strength', 7.5, type=float)
        ss_sampling_steps = request.args.get('ss_sampling_steps', 12, type=int)
        slat_guidance_strength = request.args.get('slat_guidance_strength', 3, type=float)
        slat_sampling_steps = request.args.get('slat_sampling_steps', 12, type=int)
        multiimage_algo = request.args.get('multiimage_algo', 'stochastic', type=str)
        mesh_simplify = request.args.get('mesh_simplify', 0.95, type=bool)
        texture_size = request.args.get('texture_size', 1024, type=int)

        return glb_controller.get_glb(hf_token, base_image_url, ss_guidance_strength,
                                  ss_sampling_steps, slat_guidance_strength,
                                  slat_sampling_steps, multiimage_algo,
                                  mesh_simplify, texture_size)
    
    # Text to image
    @app.route('/render', methods=['GET'])
    def get_render():
        hf_token = request.args.get('hf_token', '', type=str)
        text = request.args.get('text', 'Hello!!', type=str)
        selected_model = request.args.get('selected_model', 'Model 1 (Turbo Realism)', type=str)
        
        return render_controller.get_render(hf_token, text, selected_model)
    
    # Suggest
    @app.route('/suggest', methods=['GET'])
    def get_suggest():
        hf_token = request.args.get('hf_token', '', type=str)
        message = request.args.get('message', 'Hello!!', type=str)
        system_prompt = request.args.get('system_prompt', 'You are a helpful assistant. First recognize the user request and then reply carefully with thinking.', type=str)
        temperature = request.args.get('temperature', 0.7, type=float)
        max_new_tokens = request.args.get('max_new_tokens', 12000, type=int)
        top_k_sampling = request.args.get('top_k_sampling', 50, type=int)
        repetition_penalty = request.args.get('repetition_penalty', 1.1, type=float)
        top_p_sampling = request.args.get('top_p_sampling', 0.95, type=float)

        return suggest_controller.get_suggest(hf_token, message, system_prompt,
                                              temperature, max_new_tokens,
                                              top_k_sampling, repetition_penalty,
                                              top_p_sampling)