/**
 * Lego Ladder - Professional Arduino Exporter
 */
export function generateArduinoCode(program) {
    const pinMap = new Map();
    const setupLines = [];
    const loopLines = [];
    program.rungs.forEach((rung, idx) => {
        const expressionParts = [];
        const rungOutputs = [];
        rung.series.forEach((comp) => {
            switch (comp.type) {
                case 'contact': {
                    const c = comp;
                    const pin = parseInt(c.address.split(':')[1]) || 0; // Simple parse
                    const varName = `pin_${c.address.replace(/[^a-zA-Z0-9]/g, '_')}`;
                    pinMap.set(pin, varName);
                    setupLines.push(`pinMode(${varName}, INPUT_PULLUP);`);
                    expressionParts.push(`(digitalRead(${varName}) == ${c.contactType === 'NO' ? 'LOW' : 'HIGH'})`);
                    break;
                }
                case 'coil': {
                    const c = comp;
                    const pin = parseInt(c.address.split(':')[1]) || 0;
                    const varName = `pin_${c.address.replace(/[^a-zA-Z0-9]/g, '_')}`;
                    pinMap.set(pin, varName);
                    setupLines.push(`pinMode(${varName}, OUTPUT);`);
                    rungOutputs.push(`digitalWrite(${varName}, rung${idx}_state ? HIGH : LOW);`);
                    break;
                }
                case 'gate': {
                    const g = comp;
                    // This is a simplified mapping for demo purposes
                    // A real compiler would map individual pin states
                    expressionParts.push(`true`);
                    break;
                }
            }
        });
        const expr = expressionParts.join(' ') || 'false';
        loopLines.push(`  bool rung${idx}_state = ${expr};`);
        rungOutputs.forEach(line => loopLines.push(`  ${line}`));
    });
    return `
// Generated by Lego Technic PLC
void setup() {
${setupLines.map(l => '  ' + l).join('\n')}
}

void loop() {
${loopLines.map(l => '  ' + l).join('\n')}
  delay(10);
}
`.trim();
}