// =======================================================================
// IR TRANSCEIVER BLÖCKE (Senden & Empfangen)
// =======================================================================

Blockly.defineBlocksWithJsonArray([
    // 1. SETUP
    {
        "type": "ir_transceiver_setup",
        "message0": "⚙️ IR System Setup | 📥 Empfänger Pin %1 | 📤 Sender Pin %2",
        "args0": [
            {"type": "field_input", "name": "RX_PIN", "text": "11"},
            {"type": "field_input", "name": "TX_PIN", "text": "3"}
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 160,
        "tooltip": "Initialisiert das Infrarot-System. Wird ein Teil (Sender oder Empfänger) nicht gebraucht, trage einfach -1 ein."
    },
    // 2. EVENT (WENN EMPFANGEN)
    {
        "type": "ir_receive_event",
        "message0": "📡 Wenn IR-Signal empfangen %1 %2",
        "args0": [
            {"type": "input_dummy"},
            {"type": "input_statement", "name": "DO"}
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 160,
        "tooltip": "Führt den umschlossenen Code aus, sobald ein Infrarot-Signal empfangen wurde."
    },
    // 3. WERT AUSLESEN (HEX ODER PROTOKOLL)
    {
        "type": "ir_read_value",
        "message0": "🔍 Lese IR-Information: %1",
        "args0": [
            {"type": "field_dropdown", "name": "INFO_TYPE", "options": [
                ["Hex-Wert (Zahl)", "HEX"],
                ["Protokoll-Name (Text)", "PROTOCOL"]
            ]}
        ],
        "output": null,
        "colour": 160,
        "tooltip": "Gibt den einfachen Wert oder den Protokollnamen des empfangenen Signals zurück."
    },
    // 4. TABELLE FÜLLEN
    {
        "type": "ir_fill_array",
        "message0": "📥 Fülle Tabelle %1 mit empfangenen IR-Rohdaten",
        "args0": [
            {"type": "field_input", "name": "ARRAY_NAME", "text": "Signal"}
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 160,
        "tooltip": "Kopiert die exakten Mikrosekunden-Timings in die von dir erstellte Tabelle (Array)."
    },
    // 5. ANZAHL DER EMPFANGENEN WERTE
    {
        "type": "ir_raw_length",
        "message0": "🔢 Anzahl der empfangenen IR-Werte",
        "output": "Number",
        "colour": 160,
        "tooltip": "Gibt zurück, wie viele Rohdaten-Werte (Timings) beim letzten Signal empfangen wurden."
    },
    // 6. SENDEN (STANDARD PROTOKOLLE)
    {
        "type": "ir_send_standard",
        "message0": "📤 Sende IR-Signal | Protokoll %1 | Wert %2",
        "args0": [
            {"type": "field_dropdown", "name": "PROTOCOL", "options": [
                ["NEC", "NEC"],
                ["SONY", "Sony"],
                ["SAMSUNG", "Samsung"],
                ["RC5", "RC5"],
                ["RC6", "RC6"]
            ]},
            {"type": "input_value", "name": "VALUE"}
        ],
        "inputsInline": true,
        "previousStatement": null,
        "nextStatement": null,
        "colour": 160,
        "tooltip": "Sendet einen Standard-Code über das gewählte Protokoll."
    },
    // 7. SENDEN
    {
        "type": "ir_send_raw",
        "message0": "📤 Sende IR-Rohdaten aus Tabelle %1 | Anzahl: %2",
        "args0": [
            {"type": "field_input", "name": "ARRAY_NAME", "text": "Signal"},
            {"type": "input_value", "name": "LENGTH", "check": "Number"}
        ],
        "inputsInline": true,
        "previousStatement": null,
        "nextStatement": null,
        "colour": 160,
        "tooltip": "Feuert die gespeicherten Rohdaten aus deiner Tabelle ab."
    }
]);


// =======================================================================
// GENERATOR LOGIK FÜR C++
// =======================================================================

// SCANNER: Sammelt die Pins und Includes ein, bevor der Loop generiert wird
ArduinoGenerator.hardwareScanners['ir_transceiver_setup'] = function(block) {
    const rxPin = block.getFieldValue('RX_PIN');
    const txPin = block.getFieldValue('TX_PIN');
    
    ArduinoGenerator.globals_.add(`#include <IRremote.hpp>`);
    
    if (rxPin !== '-1' && rxPin !== '') {
        ArduinoGenerator.globals_.add(`const int IR_RX_PIN = ${rxPin};`);
    }
    if (txPin !== '-1' && txPin !== '') {
        ArduinoGenerator.globals_.add(`const int IR_TX_PIN = ${txPin};`);
    }
};

// GENERATOR: Setup Block
ArduinoGenerator.forBlock['ir_transceiver_setup'] = function(block) {
    const rxPin = block.getFieldValue('RX_PIN');
    const txPin = block.getFieldValue('TX_PIN');
    let code = '';
    
    if (rxPin !== '-1' && rxPin !== '') {
        code += `  IrReceiver.begin(IR_RX_PIN, ENABLE_LED_FEEDBACK);\n`;
    }
    if (txPin !== '-1' && txPin !== '') {
        code += `  IrSender.begin(IR_TX_PIN);\n`;
    }
    return code;
};

// GENERATOR: Event Block
ArduinoGenerator.forBlock['ir_receive_event'] = function(block) {
    const branch = ArduinoGenerator.statementToCode(block, 'DO');
    return `  if (IrReceiver.decode()) {\n${branch}    IrReceiver.resume();\n  }\n`;
};

// GENERATOR: Ausleser Block
ArduinoGenerator.forBlock['ir_read_value'] = function(block) {
    const infoType = block.getFieldValue('INFO_TYPE');
    if (infoType === 'HEX') {
        return ['IrReceiver.decodedIRData.decodedRawData', ArduinoGenerator.PRECEDENCE];
    } else {
        // Zieht den lesbaren Namen des Protokolls aus der Library und konvertiert ihn für Blockly in einen String
        return ['String(getProtocolString(IrReceiver.decodedIRData.protocol))', ArduinoGenerator.PRECEDENCE];
    }
};

// GENERATOR: Tabelle füllen
ArduinoGenerator.forBlock['ir_fill_array'] = function(block) {
    const arrayName = block.getFieldValue('ARRAY_NAME').replace(/[^a-zA-Z0-9_]/g, '');
    let code = `    int irLength = IrReceiver.decodedIRData.rawDataPtr->rawlen - 1;\n`;
    code += `    for(int i = 0; i < irLength; i++) {\n`;
    // Umwandlung in saubere Mikrosekunden, damit es beim Senden passt
    code += `      ${arrayName}[i] = IrReceiver.decodedIRData.rawDataPtr->rawbuf[i+1] * MICROS_PER_TICK;\n`;
    code += `    }\n`;
    return code;
};

// GENERATOR: Array Länge
ArduinoGenerator.forBlock['ir_raw_length'] = function(block) {
    return ['(IrReceiver.decodedIRData.rawDataPtr->rawlen - 1)', ArduinoGenerator.PRECEDENCE];
};

// GENERATOR: Standard Senden
ArduinoGenerator.forBlock['ir_send_standard'] = function(block) {
    const protocol = block.getFieldValue('PROTOCOL');
    const value = ArduinoGenerator.valueToCode(block, 'VALUE', ArduinoGenerator.PRECEDENCE) || '0';
    // 32 Bits ist der Standard für die meisten Kommandos (wird bei IRremote 3.x/4.x intern gut verarbeitet)
    return `  IrSender.send${protocol}(${value}, 32);\n`; 
};

// GENERATOR: Raw Senden
ArduinoGenerator.forBlock['ir_send_raw'] = function(block) {
    const arrayName = block.getFieldValue('ARRAY_NAME').replace(/[^a-zA-Z0-9_]/g, '');
    const length = ArduinoGenerator.valueToCode(block, 'LENGTH', ArduinoGenerator.PRECEDENCE) || '0';
    // Sendet das Array mit der Standard-Trägerfrequenz von 38 kHz
    return `  IrSender.sendRaw(${arrayName}, ${length}, 38);\n`;
};