///|
/// Scheduler Integration - JS target implementation

///|
/// Execute a script task and return the result for scheduler
pub fn execute_script_task(
  task : @scheduler.Task,
  dom : @dom.DomTree,
) -> @scheduler.TaskResult {
  match task.action {
    @scheduler.ExecuteScript(source~) => {
      let ctx = JsContext::new(dom)
      try {
        let _ = ctx.execute(source)
        @scheduler.Success(new_tasks=[])
      } catch {
        err => @scheduler.Failure(error=err.to_string())
      }
    }
    _ => @scheduler.Failure(error="Not an ExecuteScript task")
  }
}

///|
/// Process script tasks from scheduler
pub fn process_script_tasks(
  scheduler : @scheduler.Scheduler,
  dom : @dom.DomTree,
) -> Int {
  let mut processed = 0
  let ready_tasks = scheduler.poll_ready()
  for task in ready_tasks {
    match task.action {
      @scheduler.ExecuteScript(_) => {
        let result = execute_script_task(task, dom)
        let _ = scheduler.complete(task.id, result)
        processed = processed + 1
      }
      _ => ()
    }
  }
  processed
}

///|
/// Execute a script task using ScriptExecutor
pub fn ScriptExecutor::execute(
  self : ScriptExecutor,
  task : @scheduler.Task,
) -> @scheduler.TaskResult {
  match task.action {
    @scheduler.ExecuteScript(source~) =>
      try {
        let result = self.ctx.execute(source)
        for log in result.logs {
          println("[JS] " + log)
        }
        @scheduler.Success(new_tasks=[])
      } catch {
        err => @scheduler.Failure(error=err.to_string())
      }
    _ => @scheduler.Failure(error="Not an ExecuteScript task")
  }
}