/**
 * loop_flow.js
 * Schleifen-Steuerung (Wiederhole bis, Break, Continue)
 * Kompatibel mit dem custom ArduinoGenerator
 */

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

// Block: Wiederhole bis (repeat until)
Blockly.Blocks['ard_loop_until'] = {
    init: function() {
        this.setColour(290); // Farbe passend zur Kategorie "Steuerung"
        this.setPreviousStatement(true, null);
        this.setNextStatement(true, null);
        this.appendValueInput('COND')
            .setCheck(['Boolean', 'Number'])
            .appendField('Wiederhole bis');
        this.appendStatementInput('DO')
            .appendField('mache:');
        this.setTooltip('Führt die enthaltenen Blöcke solange aus, bis die Bedingung WAHR wird.');
    }
};

// Block: Schleifen-Steuerung (Break / Continue)
Blockly.Blocks['ard_loop_control'] = {
    init: function() {
        this.setColour(290); // Farbe passend zur Kategorie "Steuerung"
        this.setPreviousStatement(true, null);
        // Da "break" und "continue" den aktuellen Ablauf verlassen, 
        // wird das Anstecken weiterer Blöcke darunter blockiert.
        this.setNextStatement(false, null); 
        this.appendDummyInput()
            .appendField('Schleife')
            .appendField(new Blockly.FieldDropdown([
                ['abbrechen (break)', 'BREAK'],
                ['nächsten Durchlauf starten (continue)', 'CONTINUE']
            ]), 'ACTION');
        this.setTooltip('Bricht die aktuelle Schleife ab oder überspringt den Rest und startet sofort den nächsten Durchlauf.');
    }
};

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

// Generator: Wiederhole bis
ArduinoGenerator.forBlock['ard_loop_until'] = function(block) {
    // 0 steht für ArduinoGenerator.PRECEDENCE
    const condition = ArduinoGenerator.valueToCode(block, 'COND', 0) || 'false';
    const branch = ArduinoGenerator.statementToCode(block, 'DO');
    
    // Das Geheimnis: Ein einfaches ! negiert die Bedingung für das C++ while
    let code = '';
    code += `  while (!(${condition})) {\n`;
    code += branch;
    code += `  }\n`;
    
    return code;
};

// Generator: Schleifen-Steuerung
ArduinoGenerator.forBlock['ard_loop_control'] = function(block) {
    const action = block.getFieldValue('ACTION');
    
    if (action === 'BREAK') {
        return '  break;\n';
    } else {
        return '  continue;\n';
    }
};