from flask import Flask, request, jsonify

app = Flask(__name__)

# Dictionary to store the status counts for each source
status_counts = {
    "source1": [],
    "source2": [],
    "source3": [],
    "source4": [],
    "source5": []
}

# Dictionary to keep track of OK counts for each source
ok_counts = {
    "source1": 0,
    "source2": 0,
    "source3": 0,
    "source4": 0,
    "source5": 0
}

# Dictionary to track if a source is in force send mode
force_send_mode = {
    "source1": False,
    "source2": False,
    "source3": False,
    "source4": False,
    "source5": False
}


# Function to check if there are 5 consecutive failures
def check_consecutive_failures(source, status_list):
    if len(status_list) >= 5 and status_list[-5:] == ['FAIL'] * 5:
        print(f"Source {source} has 5 consecutive FAILs!")
        force_send_mode[source] = True
        send_message(source, force_send=True)


# Function to send a message
def send_message(source, force_send=False):
    if force_send or ok_counts[source] >= 10:
        print(f"Sending message for {source} - Status: {'FORCE SEND' if force_send else 'OK SEND'}")
        ok_counts[source] = 0  # Reset counter after sending


# Route to receive data from sources
@app.route('/status', methods=['POST'])
def receive_status():
    data = request.json
    source = data.get('source')
    status = data.get('status')

    if source in status_counts:
        status_counts[source].append(status)
        # Ensure we keep only the latest 5 statuses to check for consecutive FAILs
        if len(status_counts[source]) > 5:
            status_counts[source].pop(0)

        if status == 'OK':
            ok_counts[source] += 1
            if force_send_mode[source] and ok_counts[source] >= 10:
                # Revert to normal mode after 10 consecutive OKs
                force_send_mode[source] = False
                ok_counts[source] = 0
            elif not force_send_mode[source]:
                send_message(source)
        else:
            ok_counts[source] = 0  # Reset counter on FAIL

        check_consecutive_failures(source, status_counts[source])

    return jsonify({"message": "Status received"}), 200


if __name__ == '__main__':
    app.run(debug=True, port=5000)
