from flask import Flask, render_template, request, jsonify
from config import get_config
from flask_cors import CORS
from models.recipe_model import get_recipe_generator
from services.search_service import get_search_service
from services.nutrition_service import get_nutrition_service

# Flask app
app = Flask(__name__, template_folder='templates', static_folder='static')
config = get_config()
app.config.from_object(config)

# Initialize services
recipe_generator = get_recipe_generator()
search_service = get_search_service()
nutrition_service = get_nutrition_service()


#  Home Page
@app.route('/')
def index():
    """Render home page"""
    return render_template('index.html')


# Generate Recipe
@app.route('/api/generate', methods=['POST'])
def generate_recipe():
    """
    Generate a recipe based on ingredients and meal type
    
    Request JSON:
        {
            "ingredients": ["chicken", "garlic", "tomato"],
            "meal_type": "dinner",
            "num_words": 150
        }
    """
    try:
        data = request.json
        ingredients = data.get('ingredients', [])
        meal_type = data.get('meal_type', '')
        num_words = data.get('num_words', 150)
        
        if not ingredients:
            return jsonify({"error": "Ingredients are required"}), 400
        
        # Generate recipe
        recipe = recipe_generator.generate_recipe(ingredients, meal_type, num_words)
        
        # Get nutrition info
        nutrition_info = nutrition_service.analyze_recipe(ingredients)
        
        return jsonify({
            "success": True,
            "recipe": recipe,
            "ingredients": ingredients,
            "meal_type": meal_type,
            "nutrition": nutrition_info,
            "nutrition_summary": nutrition_service.get_nutrition_summary(nutrition_info)
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# ROUTE 3: Search Recipes
@app.route('/api/search', methods=['POST'])
def search_recipes():
    """
    Search for recipes using multiple filters
    
    Request JSON:
        {
            "ingredients": ["chicken", "garlic"],
            "meal_type": "dinner",
            "max_cooking_time": 45,
            "difficulty": "easy",
            "limit": 10
        }
    """
    try:
        data = request.json
        ingredients = data.get('ingredients', [])
        meal_type = data.get('meal_type')
        max_cooking_time = data.get('max_cooking_time')
        difficulty = data.get('difficulty')
        limit = data.get('limit', 10)
        
        # Perform search
        results = search_service.advanced_search(
            ingredients=ingredients if ingredients else None,
            meal_type=meal_type,
            max_cooking_time=max_cooking_time,
            difficulty=difficulty,
            limit=limit
        )
        
        return jsonify({
            "success": True,
            "count": len(results),
            "recipes": results
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500



#Get Recipe by ID
@app.route('/api/recipe/<int:recipe_id>', methods=['GET'])
def get_recipe(recipe_id):
    """Get a specific recipe by ID"""
    try:
        recipe = search_service.get_recipe_by_id(recipe_id)
        
        if not recipe:
            return jsonify({"error": "Recipe not found"}), 404
        
        # Get nutrition info
        nutrition_info = nutrition_service.analyze_recipe(recipe['ingredients'])
        
        return jsonify({
            "success": True,
            "recipe": recipe,
            "nutrition": nutrition_info,
            "nutrition_summary": nutrition_service.get_nutrition_summary(nutrition_info)
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500



# Nutrition Analysis
@app.route('/api/nutrition', methods=['POST'])
def analyze_nutrition():
    """
    Analyze nutrition for ingredients
    
    Request JSON:
        {
            "ingredients": ["100g chicken", "50g olive oil", "2 tomatoes"],
            "servings": 2
        }
    """
    try:
        data = request.json
        ingredients = data.get('ingredients', [])
        servings = data.get('servings', 1)
        
        if not ingredients:
            return jsonify({"error": "Ingredients are required"}), 400
        
        # Analyze nutrition
        nutrition_info = nutrition_service.analyze_recipe(ingredients, servings)
        dv_percentages = nutrition_service.get_daily_value_percentages(nutrition_info)
        
        return jsonify({
            "success": True,
            "nutrition": nutrition_info,
            "daily_value_percentages": dv_percentages,
            "summary": nutrition_service.get_nutrition_summary(nutrition_info)
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500


#  Search by Ingredients

@app.route('/api/search/ingredients', methods=['POST'])
def search_by_ingredients():
    """Search recipes by ingredients"""
    try:
        data = request.json
        ingredients = data.get('ingredients', [])
        limit = data.get('limit', 10)
        
        if not ingredients:
            return jsonify({"error": "Ingredients are required"}), 400
        
        results = search_service.search_by_ingredients(ingredients, limit)
        
        return jsonify({
            "success": True,
            "count": len(results),
            "recipes": results
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500


#  Search by Meal Type

@app.route('/api/search/meal-type/<meal_type>', methods=['GET'])
def search_by_meal_type(meal_type):
    """Search recipes by meal type"""
    try:
        limit = request.args.get('limit', 10, type=int)
        results = search_service.search_by_meal_type(meal_type, limit)
        
        return jsonify({
            "success": True,
            "meal_type": meal_type,
            "count": len(results),
            "recipes": results
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# Search by Cooking Time

@app.route('/api/search/time/<int:max_time>', methods=['GET'])
def search_by_time(max_time):
    """Search recipes by maximum cooking time (in minutes)"""
    try:
        limit = request.args.get('limit', 10, type=int)
        results = search_service.search_by_cooking_time(max_time, limit)
        
        return jsonify({
            "success": True,
            "max_cooking_time": max_time,
            "count": len(results),
            "recipes": results
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500


#Search by Difficulty

@app.route('/api/search/difficulty/<difficulty>', methods=['GET'])
def search_by_difficulty(difficulty):
    """Search recipes by difficulty level"""
    try:
        limit = request.args.get('limit', 10, type=int)
        results = search_service.search_by_difficulty(difficulty, limit)
        
        return jsonify({
            "success": True,
            "difficulty": difficulty,
            "count": len(results),
            "recipes": results
        }), 200
    
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# Health Check

@app.route('/api/health', methods=['GET'])
def health_check():
    """Health check endpoint"""
    return jsonify({
        "status": "healthy",
        "recipe_generator_available": recipe_generator.is_available(),
        "search_service_available": True,
        "nutrition_service_available": True
    }), 200


@app.errorhandler(404)
def not_found(e):
    """Handle 404 errors"""
    return jsonify({"error": "Endpoint not found"}), 404


@app.errorhandler(500)
def server_error(e):
    """Handle 500 errors"""
    return jsonify({"error": "Internal server error"}), 500

if __name__ == '__main__':
    print("=" * 60)
    print("AI Recipe Generator - Starting Server")
    print("=" * 60)
    print(f"Environment: {app.config.get('DEBUG', False) and 'Development' or 'Production'}")
    print(f"Device: {config.DEVICE}")
    print(f"Recipe Generator Available: {recipe_generator.is_available()}")
    print("=" * 60)
    print("\nServer running at http://localhost:5000")
    print("\nAvailable endpoints:")
    print("  POST   /api/generate              - Generate recipe from ingredients")
    print("  POST   /api/search                - Advanced recipe search")
    print("  POST   /api/search/ingredients   - Search by ingredients")
    print("  GET    /api/search/meal-type/<type> - Search by meal type")
    print("  GET    /api/search/time/<minutes>   - Search by cooking time")
    print("  GET    /api/search/difficulty/<level> - Search by difficulty")
    print("  GET    /api/recipe/<id>          - Get recipe by ID")
    print("  POST   /api/nutrition            - Analyze nutrition")
    print("  GET    /api/health               - Health check")
    print("=" * 60)
    
    app.run(debug=config.DEBUG, host='0.0.0.0', port=8000)


