esphome:
  name: test-script-delay-params

host:

api:
  actions:
    # Test case from issue #12044: parent script with repeat calling child with delay
    - action: test_repeat_with_delay
      then:
        - logger.log: "=== TEST: Repeat loop calling script with delay and parameters ==="
        - script.execute: father_script

    # Test case from issue #12043: script.wait with delayed child script
    - action: test_script_wait
      then:
        - logger.log: "=== TEST: script.wait with delayed child script ==="
        - script.execute: show_start_page
        - script.wait: show_start_page
        - logger.log: "After wait: script completed successfully"

    # Test: Delay with different parameter types
    - action: test_delay_param_types
      then:
        - logger.log: "=== TEST: Delay with various parameter types ==="
        - script.execute:
            id: delay_with_int
            val: 42
        - delay: 50ms
        - script.execute:
            id: delay_with_string
            msg: "test message"
        - delay: 50ms
        - script.execute:
            id: delay_with_float
            num: 3.14

logger:
  level: DEBUG

script:
  # Reproduces issue #12044: child script with conditional delay
  - id: son_script
    mode: single
    parameters:
      iteration: int
    then:
      - logger.log:
          format: "Son script started with iteration %d"
          args: ['iteration']
      - if:
          condition:
            lambda: 'return iteration >= 5;'
          then:
            - logger.log:
                format: "Son script delaying for iteration %d"
                args: ['iteration']
            - delay: 100ms
      - logger.log:
          format: "Son script finished with iteration %d"
          args: ['iteration']

  # Reproduces issue #12044: parent script with repeat loop
  - id: father_script
    mode: single
    then:
      - repeat:
          count: 10
          then:
            - logger.log:
                format: "Father iteration %d: calling son"
                args: ['iteration']
            - script.execute:
                id: son_script
                iteration: !lambda 'return iteration;'
            - script.wait: son_script
            - logger.log:
                format: "Father iteration %d: son finished, wait returned"
                args: ['iteration']

  # Reproduces issue #12043: script.wait hangs
  - id: show_start_page
    mode: single
    then:
      - logger.log: "Start page: beginning"
      - delay: 100ms
      - logger.log: "Start page: after delay"
      - delay: 100ms
      - logger.log: "Start page: completed"

  # Test delay with int parameter
  - id: delay_with_int
    mode: single
    parameters:
      val: int
    then:
      - logger.log:
          format: "Int test: before delay, val=%d"
          args: ['val']
      - delay: 50ms
      - logger.log:
          format: "Int test: after delay, val=%d"
          args: ['val']

  # Test delay with string parameter
  - id: delay_with_string
    mode: single
    parameters:
      msg: string
    then:
      - logger.log:
          format: "String test: before delay, msg=%s"
          args: ['msg.c_str()']
      - delay: 50ms
      - logger.log:
          format: "String test: after delay, msg=%s"
          args: ['msg.c_str()']

  # Test delay with float parameter
  - id: delay_with_float
    mode: single
    parameters:
      num: float
    then:
      - logger.log:
          format: "Float test: before delay, num=%.2f"
          args: ['num']
      - delay: 50ms
      - logger.log:
          format: "Float test: after delay, num=%.2f"
          args: ['num']
