// =======================================================================
// LOGIKKISTE - STATE MACHINE 2.0
// =======================================================================

Blockly.defineBlocksWithJsonArray([
    // --- 1. STATE MACHINE 2.0 (Mit automatischem Timer) ---
    {
        "type": "ard_switch_2",
        "message0": "Profi-Schrittkette für Wert: %1 %2 %3",
        "args0": [
            {
                "type": "input_value", 
                "name": "SWITCH_VAL"
            },
            {"type": "input_dummy"},
            {
                "type": "input_statement", 
                "name": "CASES",
                "check": "CaseBlock" // Bleibt wie gewünscht einheitlich
            }
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 210, // NEUE FARBE für die 2.0 Version
        "tooltip": "State Machine 2.0: Misst automatisch die Zeit, wie lange ein Zustand bereits aktiv ist."
    },

    // --- 1.1 NEU: EINZELNER ZUSTAND 2.0 (CASE - BLAU) ---
    {
        "type": "ard_case_2",
        "message0": "Bei Profi-Zustand: %1 %2 Mache: %3",
        "args0": [
            {"type": "input_value", "name": "CASE_VAL", "check": "Number"},
            {"type": "input_dummy"},
            {"type": "input_statement", "name": "DO"}
        ],
        "previousStatement": "CaseBlock", 
        "nextStatement": "CaseBlock",     
        "colour": 210, // BLAU
        "tooltip": "Wird ausgeführt, wenn der Wert genau diesem Zustand entspricht. (Multitasking: Blockiert das restliche Programm nicht)"
    },

    // --- 1.2 NEU: DER STANDARD-FALL 2.0 (DEFAULT) ---
    {
        "type": "ard_default_2",
        "message0": "Profi-Standardfall (Wenn nichts passt) %1 Mache: %2",
        "args0": [
            {"type": "input_dummy"},
            {"type": "input_statement", "name": "DO"}
        ],
        "previousStatement": "CaseBlock", 
        "colour": 210, // BLAU
        "tooltip": "Wird nur ausgeführt, wenn keiner der anderen Zustände passt. Gehört ganz ans Ende!"
    },

    // --- 1.3 NEU: BLOCKIERENDER ZUSTAND (CASE - GRÜN) ---
    {
        "type": "ard_case_cond_2",
        "message0": "Bei Profi-Zustand: %1 %2 Solange: %3",
        "args0": [
            {"type": "input_value", "name": "CASE_VAL", "check": "Number"},
            {"type": "input_dummy"},
            {"type": "input_statement", "name": "DO"}
        ],
        "previousStatement": "CaseBlock", 
        "nextStatement": "CaseBlock",     
        "colour": 120, // GRÜN für die Schleifen-Optik
        "tooltip": "ACHTUNG: Blockiert das restliche Programm! Wird als Dauerschleife ausgeführt, solange der Zustand aktiv ist."
    },

    // --- 2. ZEITABFRAGE (Gibt die ms des aktuellen Schritts aus) ---
    {
        "type": "ard_state_time",
        "message0": "Aktuelle Schrittzeit in ms",
        "output": "Number",
        "colour": 210, // BLAU
        "tooltip": "Gibt die Zeit in Millisekunden zurück, die der aktuelle Schritt bereits aktiv ist. Funktioniert nur innerhalb der Profi-Schrittkette!"
    },

    // --- 3. BREAK (Schritt / Schleife verlassen) ---
    {
        "type": "ard_break",
        "message0": "Verlasse aktuellen Schritt / Schleife sofort",
        "previousStatement": null,
        "nextStatement": null,
        "colour": 210, // BLAU
        "tooltip": "Bricht den aktuellen Zustand (case) oder die aktuelle Schleife (for/while) sofort ab. (C++: break;)"
    },

    // --- 4. RETURN (Hauptprogramm neu starten) ---
    {
        "type": "ard_return",
        "message0": "Starte Hauptprogramm (Loop) sofort neu",
        "previousStatement": null,
        "nextStatement": null,
        "colour": 210, // BLAU
        "tooltip": "Bricht alles ab und startet den Arduino Loop sofort wieder in der allerersten Zeile. (C++: return;)"
    },

    // --- 5. STATIC VARIABLE (Der lokale Merker) ---
    {
        "type": "ard_static_var",
        "message0": "Erstelle Merker (static) %1 Name: %2 Startwert: %3",
        "args0": [
            {
                "type": "field_dropdown",
                "name": "TYPE",
                "options": [
                    ["Zahl (int)", "int"],
                    ["Kommazahl (float)", "float"],
                    ["Wahrheitswert (bool)", "bool"],
                    ["Zeichen (char)", "char"]
                ]
            },
            {"type": "field_input", "name": "VAR_NAME", "text": "meinMerker"},
            {"type": "input_value", "name": "START_VAL"}
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 330, // Bleibt 330, da es optisch zu den Variablen gehört
        "tooltip": "Erstellt eine Variable, die nur in diesem Block/Schritt existiert, sich ihren Wert aber für den nächsten Durchlauf merkt! (C++: static)"
    }
]);

// =======================================================================
// C++ CODE GENERATOREN
// =======================================================================

// --- 1. GENERATOR: SWITCH 2.0 ---
ArduinoGenerator.forBlock['ard_switch_2'] = function(block) {
    const switchVal = ArduinoGenerator.valueToCode(block, 'SWITCH_VAL', 0) || '0';
    const casesCode = ArduinoGenerator.statementToCode(block, 'CASES');
    
    const blockId = block.id.replace(/[^a-zA-Z0-9]/g, '_'); 

    ArduinoGenerator.globals_.add(`unsigned long stateStartTime_${blockId} = 0;`);
    ArduinoGenerator.globals_.add(`unsigned long currentStateTime_${blockId} = 0;`);
    ArduinoGenerator.globals_.add(`long lastState_${blockId} = -999;`);

    let code = `  // --- State Machine 2.0 Timer ---
  if (lastState_${blockId} != (${switchVal})) {
    stateStartTime_${blockId} = millis();
    lastState_${blockId} = (${switchVal});
  }
  currentStateTime_${blockId} = millis() - stateStartTime_${blockId};

  switch (${switchVal}) {\n${casesCode}  }\n`;

    return code;
};

// --- 1.1 NEU: GENERATOR FÜR CASE 2.0 (BLAU) ---
ArduinoGenerator.forBlock['ard_case_2'] = function(block) {
    const val = ArduinoGenerator.valueToCode(block, 'CASE_VAL', 0) || '0';
    const doCode = ArduinoGenerator.statementToCode(block, 'DO');
    return `    case ${val}:\n${doCode}      break;\n`;
};

// --- 1.2 NEU: GENERATOR FÜR DEFAULT 2.0 ---
ArduinoGenerator.forBlock['ard_default_2'] = function(block) {
    const doCode = ArduinoGenerator.statementToCode(block, 'DO');
    return `    default:\n${doCode}      break;\n`;
};

// --- 1.3 NEU: GENERATOR FÜR DEN BLOCKIERENDEN ZUSTAND (GRÜN) ---
ArduinoGenerator.forBlock['ard_case_cond_2'] = function(block) {
    const val = ArduinoGenerator.valueToCode(block, 'CASE_VAL', 0) || '0';
    const doCode = ArduinoGenerator.statementToCode(block, 'DO');
    
    // Genialer Trick: Wir klettern im Baum nach oben, um herauszufinden, 
    // welche Variable im Haupt-Switch eigentlich geprüft wird!
    let parent = block.getSurroundParent();
    let switchValCode = '0';
    
    while (parent) {
        if (parent.type === 'ard_switch_2') {
            switchValCode = ArduinoGenerator.valueToCode(parent, 'SWITCH_VAL', 0) || '0';
            break;
        }
        parent = parent.getSurroundParent();
    }
    
    // Baut eine echte while-Schleife
    return `    case ${val}:\n      while (${switchValCode} == ${val}) {\n${doCode}      }\n      break;\n`;
};

// --- 2. GENERATOR: ZEITABFRAGE ---
ArduinoGenerator.forBlock['ard_state_time'] = function(block) {
    let parent = block.getSurroundParent();
    let switchId = null;
    
    while (parent) {
        if (parent.type === 'ard_switch_2') {
            switchId = parent.id.replace(/[^a-zA-Z0-9]/g, '_');
            break;
        }
        parent = parent.getSurroundParent();
    }
    
    let code = "0";
    if (switchId) {
        code = `currentStateTime_${switchId}`;
    } else {
        code = `0 /* FEHLER: Zeit-Block muss innerhalb der Profi-Schrittkette platziert werden! */`;
    }
    
    return [code, 0]; 
};

// --- 3. GENERATOR: BREAK ---
ArduinoGenerator.forBlock['ard_break'] = function(block) {
    return `  break;\n`;
};

// --- 4. GENERATOR: RETURN ---
ArduinoGenerator.forBlock['ard_return'] = function(block) {
    return `  return;\n`;
};

// --- 5. GENERATOR: STATIC VARIABLE ---
ArduinoGenerator.forBlock['ard_static_var'] = function(block) {
    const type = block.getFieldValue('TYPE');
    const varName = block.getFieldValue('VAR_NAME');
    const startVal = ArduinoGenerator.valueToCode(block, 'START_VAL', 0) || '0';
    
    return `  static ${type} ${varName} = ${startVal};\n`;
};