// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/zxdb/expr/format_node.h"

#include <lib/syslog/cpp/macros.h>

#include "src/developer/debug/zxdb/expr/eval_context.h"

namespace zxdb {

FormatNode::FormatNode(const std::string& name) : name_(name), weak_factory_(this) {}

FormatNode::FormatNode(const std::string& name, ExprValue value)
    : source_(kValue),
      state_(kHasValue),
      name_(name),
      value_(std::move(value)),
      weak_factory_(this) {}

FormatNode::FormatNode(const std::string& name, ErrOrValue err_or_value)
    : source_(kValue),
      state_(err_or_value.has_error() ? kDescribed : kHasValue),
      name_(name),
      value_(err_or_value.take_value_or_empty()),
      err_(err_or_value.err_or_empty()),
      weak_factory_(this) {}

FormatNode::FormatNode(const std::string& name, Err err)
    : source_(kValue), state_(kDescribed), name_(name), err_(std::move(err)), weak_factory_(this) {}

FormatNode::FormatNode(const std::string& name, const std::string& expression)
    : source_(kExpression),
      state_(kUnevaluated),
      name_(name),
      expression_(expression),
      weak_factory_(this) {}

FormatNode::FormatNode(const std::string& name, GetProgramaticValue get_value)
    : source_(kProgramatic),
      state_(kUnevaluated),
      name_(name),
      get_programatic_value_(std::move(get_value)),
      weak_factory_(this) {
  FX_DCHECK(get_programatic_value_);  // Caller must specify nonempty func.
}

FormatNode::FormatNode(GroupTag)
    : source_(kValue),  // Don't compute a value, there is none.
      state_(kDescribed),
      description_kind_(kGroup),
      weak_factory_(this) {}

FormatNode::~FormatNode() = default;

fxl::WeakPtr<FormatNode> FormatNode::GetWeakPtr() { return weak_factory_.GetWeakPtr(); }

void FormatNode::FillProgramaticValue(const fxl::RefPtr<EvalContext>& context,
                                      fit::deferred_callback cb) {
  FX_DCHECK(source() == kProgramatic);
  FX_DCHECK(get_programatic_value_);
  get_programatic_value_(std::move(context), [weak_node = GetWeakPtr(), cb = std::move(cb)](
                                                 const Err& err, ExprValue value) {
    if (weak_node) {
      weak_node->state_ = kHasValue;
      if (err.has_error())
        weak_node->set_err(err);
      else
        weak_node->SetValue(std::move(value));
    }
  });
}

void FormatNode::SetValue(ExprValue v) {
  value_ = std::move(v);
  set_state(kHasValue);
}

void FormatNode::SetDescribedError(const Err& e) {
  set_err(e);
  set_state(kDescribed);
}

}  // namespace zxdb
