from flask import Blueprint, request, jsonify
from auth import require_creditfair
from models import db, Rule

bp = Blueprint('rules', __name__)

@bp.route('/api/rules', methods=['GET'])
@require_creditfair
def get_rules():
    rules = Rule.query.all()
    return jsonify([r.to_dict() for r in rules]), 200

@bp.route('/api/rules', methods=['POST'])
@require_creditfair
def create_rule():
    data = request.get_json()
    try:
        rule = Rule(
            key=data['key'],
            description=data['description'],
            value=data['value'],
            priority=data['priority'],
            status=data['status'],
            fallback=data.get('fallback')
        )
        db.session.add(rule)
        db.session.commit()
        return jsonify(rule.to_dict()), 201
    except KeyError as e:
        return jsonify({"error": "Invalid request data", "message": f"Missing required field: {str(e)}"}), 400

@bp.route('/api/rules/<id>', methods=['PUT'])
@require_creditfair
def update_rule(id):
    rule = Rule.query.get(id)
    if not rule:
        return jsonify({"error": "Resource not found", "message": f"Rule with id '{id}' not found"}), 404

    data = request.get_json() or {}
    if 'key' in data:
        rule.key = data['key']
    if 'description' in data:
        rule.description = data['description']
    if 'value' in data:
        rule.value = data['value']
    if 'priority' in data:
        rule.priority = data['priority']
    if 'status' in data:
        rule.status = data['status']
    if 'fallback' in data:
        rule.fallback = data['fallback']
    db.session.commit()
    return jsonify(rule.to_dict()), 200

@bp.route('/api/rules/<id>', methods=['DELETE'])
@require_creditfair
def delete_rule(id):
    rule = Rule.query.get(id)
    if not rule:
        return jsonify({"error": "Resource not found", "message": f"Rule with id '{id}' not found"}), 404

    db.session.delete(rule)
    db.session.commit()
    return '', 204
