from flask import Flask, render_template, request, jsonify, abort
from flask_httpauth import HTTPBasicAuth
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
auth = HTTPBasicAuth()

# Dummy data for downscale patterns
patterns = [
    {'id': 1, 'pattern': 'High CPU Usage', 'action': 'Scale down instances'},
    {'id': 2, 'pattern': 'Low Network Traffic', 'action': 'Reduce network bandwidth'}
]

users = {
    "admin": generate_password_hash("secret")
}

@auth.verify_password
def verify_password(username, password):
    if username in users and check_password_hash(users.get(username), password):
        return username
    return None

@auth.error_handler
def unauthorized():
    return jsonify({'message': 'Unauthorized access'}), 401


@app.route('/')
@auth.login_required
def index():
    return render_template('downscale_config.html')

@app.route('/patterns', methods=['GET', 'POST'])
@auth.login_required
def get_patterns():
    if request.method == 'GET':
        return jsonify(patterns)
    elif request.method == 'POST':
        data = request.get_json()
        pattern = data.get('pattern')
        action = data.get('action')
        if not pattern or not action:
            abort(400)  # Bad Request
        new_id = max(p['id'] for p in patterns) + 1 if patterns else 1
        new_pattern = {'id': new_id, 'pattern': pattern, 'action': action}
        patterns.append(new_pattern)
        return jsonify(new_pattern), 201  # Created

@app.route('/patterns/<int:pattern_id>', methods=['GET', 'PUT', 'DELETE'])
@auth.login_required
def manage_pattern(pattern_id):
    pattern = next((p for p in patterns if p['id'] == pattern_id), None)
    if pattern is None:
        abort(404)  # Not Found

    if request.method == 'GET':
        return jsonify(pattern)
    elif request.method == 'PUT':
        data = request.get_json()
        pattern_text = data.get('pattern')
        action_text = data.get('action')
        if not pattern_text or not action_text:
            abort(400)  # Bad Request
        pattern['pattern'] = pattern_text
        pattern['action'] = action_text
        return jsonify(pattern)
    elif request.method == 'DELETE':
        patterns.remove(pattern)
        return '', 204  # No Content

if __name__ == '__main__':
    app.run(debug=True)