// =========================================================
// ARRAY PROCESSING (Datenpufferung & Signalverarbeitung)
// =========================================================

Blockly.defineBlocksWithJsonArray([
    // 1. Ringspeicher / FIFO Push
    {
        "type": "array_fifo_push",
        "message0": "🔄 Ringspeicher: %1 neuen Wert %2 eintragen",
        "args0": [
            {"type": "field_input", "name": "ARRAY_NAME", "text": "MeineWerte"},
            {"type": "input_value", "name": "VALUE"}
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 315,
        "tooltip": "Schreibt einen Wert in die Tabelle. Ist sie voll, wird der älteste Wert überschrieben."
    },
    // 2. Mittelwert (Gleitend in Kombi mit FIFO)
    {
        "type": "array_average",
        "message0": "📊 Mittelwert von Tabelle: %1",
        "args0": [
            {"type": "field_input", "name": "ARRAY_NAME", "text": "MeineWerte"}
        ],
        "output": "Number",
        "colour": 315,
        "tooltip": "Berechnet den Durchschnitt aller Werte in der Tabelle."
    },
    // 3. Minimum / Maximum
    {
        "type": "array_min_max",
        "message0": "🔍 Finde %1 in Tabelle: %2",
        "args0": [
            {"type": "field_dropdown", "name": "MODE", "options": [
                ["kleinsten Wert (Min)", "MIN"],
                ["größten Wert (Max)", "MAX"]
            ]},
            {"type": "field_input", "name": "ARRAY_NAME", "text": "MeineWerte"}
        ],
        "output": "Number",
        "colour": 315,
        "tooltip": "Sucht den Extremwert in der Tabelle."
    },
    // 4. Array Initialisieren / Füllen
    {
        "type": "array_fill",
        "message0": "🧹 Tabelle: %1 komplett füllen mit Wert: %2",
        "args0": [
            {"type": "field_input", "name": "ARRAY_NAME", "text": "MeineWerte"},
            {"type": "input_value", "name": "VALUE"}
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 315,
        "tooltip": "Überschreibt alle Fächer der Tabelle mit demselben Wert."
    }
]);

// --- GENERATOREN ---

ArduinoGenerator.forBlock['array_fifo_push'] = function(block) {
    const name = block.getFieldValue('ARRAY_NAME').replace(/[^a-zA-Z0-9_]/g, '');
    const val = ArduinoGenerator.valueToCode(block, 'VALUE', 0) || '0';
    
    // Globale Index-Variable für den Ringspeicher anlegen
    ArduinoGenerator.globals_.add(`uint16_t fifo_idx_${name} = 0;`);
    
    // C++ Trick: (sizeof(array)/sizeof(array[0])) ermittelt die Größe automatisch
    return `  ${name}[fifo_idx_${name}] = ${val};\n  fifo_idx_${name} = (fifo_idx_${name} + 1) % (sizeof(${name})/sizeof(${name}[0]));\n`;
};

ArduinoGenerator.forBlock['array_average'] = function(block) {
    const name = block.getFieldValue('ARRAY_NAME').replace(/[^a-zA-Z0-9_]/g, '');
    
    ArduinoGenerator.globals_.add(`
template <typename T, size_t N>
float arr_avg(T (&arr)[N]) {
  float sum = 0;
  for(size_t i = 0; i < N; i++) sum += arr[i];
  return sum / N;
}`);
    return [`arr_avg(${name})`, 0];
};

ArduinoGenerator.forBlock['array_min_max'] = function(block) {
    const name = block.getFieldValue('ARRAY_NAME').replace(/[^a-zA-Z0-9_]/g, '');
    const mode = block.getFieldValue('MODE');
    
    ArduinoGenerator.globals_.add(`
template <typename T, size_t N>
T arr_min(T (&arr)[N]) {
  T val = arr[0];
  for(size_t i = 1; i < N; i++) if(arr[i] < val) val = arr[i];
  return val;
}
template <typename T, size_t N>
T arr_max(T (&arr)[N]) {
  T val = arr[0];
  for(size_t i = 1; i < N; i++) if(arr[i] > val) val = arr[i];
  return val;
}`);
    
    const func = mode === 'MIN' ? 'arr_min' : 'arr_max';
    return [`${func}(${name})`, 0];
};

ArduinoGenerator.forBlock['array_fill'] = function(block) {
    const name = block.getFieldValue('ARRAY_NAME').replace(/[^a-zA-Z0-9_]/g, '');
    const val = ArduinoGenerator.valueToCode(block, 'VALUE', 0) || '0';
    
    ArduinoGenerator.globals_.add(`
template <typename T, size_t N>
void arr_fill(T (&arr)[N], T val) {
  for(size_t i = 0; i < N; i++) arr[i] = val;
}`);
    return `  arr_fill(${name}, (decltype(${name}[0]))${val});\n`;
};