/**
 * system_control.js
 * System-Blöcke: Programm-Stopp und Run-Once
 * Kompatibel mit dem custom ArduinoGenerator
 */

// =======================================================================
// 1. BLOCK-DEFINITIONEN (UI & VERHALTEN)
// =======================================================================

// Block: Programm dauerhaft anhalten (Not-Aus)
Blockly.Blocks['ard_system_halt'] = {
    init: function() {
        this.setColour(330); // Rot/Pink-Ton für Warnung/Stopp (wie Variablen oder speziell auffällig)
        this.setPreviousStatement(true, null);
        // Kein NextStatement! Nach diesem Block wird nichts mehr ausgeführt.
        this.setNextStatement(false, null); 
        this.appendDummyInput()
            .appendField('🛑 Programm dauerhaft anhalten');
        this.setTooltip('Stoppt die Ausführung des Programms an dieser Stelle dauerhaft (Endlosschleife). Eignet sich für Not-Aus oder kritische Sensorfehler.');
    }
};

// Block: Nur einmal ausführen (Run Once)
Blockly.Blocks['ard_run_once'] = {
    init: function() {
        this.setColour(290); // Farbe passend zur Kategorie "Steuerung/Zeiten"
        this.setPreviousStatement(true, null);
        this.setNextStatement(true, null);
        this.appendDummyInput()
            .appendField('Nur einmal ausführen (Run Once)');
        this.appendStatementInput('DO')
            .appendField('mache:');
        this.setTooltip('Führt die enthaltenen Blöcke genau ein einziges Mal aus, selbst wenn dieser Block im loop() liegt. Wird automatisch gespeichert.');
    }
};


// =======================================================================
// 2. GENERATOR-LOGIK (C++ CODE ERZEUGUNG)
// =======================================================================

// Generator für Programm anhalten
ArduinoGenerator.forBlock['ard_system_halt'] = function(block) {
    // yield() sorgt dafür, dass System-Hintergrundprozesse (z. B. beim UNO R4 WiFi) 
    // nicht komplett abstürzen, während der restliche Programmfluss blockiert ist.
    return '  while (true) {\n    yield();\n  }\n';
};

// Generator für Nur einmal ausführen
ArduinoGenerator.forBlock['ard_run_once'] = function(block) {
    const branchCode = ArduinoGenerator.statementToCode(block, 'DO');
    
    // Eindeutige ID für die Merker-Variable (verhindert Konflikte bei mehreren Blöcken)
    const safeId = block.id.replace(/[^a-zA-Z0-9]/g, '_');
    
    let code = '';
    code += `  static bool hasRun_${safeId} = false;\n`;
    code += `  if (!hasRun_${safeId}) {\n`;
    code += branchCode;
    code += `    hasRun_${safeId} = true;\n`;
    code += `  }\n`;
    
    return code;
};