// Copyright IBM Corp. 2019, 2026
// SPDX-License-Identifier: MPL-2.0

package tfjson

// CheckKind is a string representation of the type of conditional check
// referenced in a check result.
type CheckKind string

const (
	// CheckKindResource indicates the check result is from a pre- or
	// post-condition on a resource or data source.
	CheckKindResource CheckKind = "resource"

	// CheckKindOutputValue indicates the check result is from an output
	// post-condition.
	CheckKindOutputValue CheckKind = "output_value"

	// CheckKindCheckBlock indicates the check result is from a check block.
	CheckKindCheckBlock CheckKind = "check"
)

// CheckStatus is a string representation of the status of a given conditional
// check.
type CheckStatus string

const (
	// CheckStatusPass indicates the check passed.
	CheckStatusPass CheckStatus = "pass"

	// CheckStatusFail indicates the check failed.
	CheckStatusFail CheckStatus = "fail"

	// CheckStatusError indicates the check errored. This is distinct from
	// CheckStatusFail in that it represents a logical or configuration error
	// within the check block that prevented the check from executing, as
	// opposed to the check was attempted and evaluated to false.
	CheckStatusError CheckStatus = "error"

	// CheckStatusUnknown indicates the result of the check was not known. This
	// could be because a value within the check could not be known at plan
	// time, or because the overall plan failed for an unrelated reason before
	// this check could be executed.
	CheckStatusUnknown CheckStatus = "unknown"
)

// CheckStaticAddress details the address of the object that performed a given
// check. The static address points to the overall resource, as opposed to the
// dynamic address which contains the instance key for any resource that has
// multiple instances.
type CheckStaticAddress struct {
	// ToDisplay is a formatted and ready to display representation of the
	// address.
	ToDisplay string `json:"to_display"`

	// Kind represents the CheckKind of this check.
	Kind CheckKind `json:"kind"`

	// Module is the module part of the address. This will be empty for any
	// resources in the root module.
	Module string `json:"module,omitempty"`

	// Mode is the ResourceMode of the resource that contains this check. This
	// field is only set is Kind equals CheckKindResource.
	Mode ResourceMode `json:"mode,omitempty"`

	// Type is the resource type for the resource that contains this check. This
	// field is only set if Kind equals CheckKindResource.
	Type string `json:"type,omitempty"`

	// Name is the name of the resource, check block, or output that contains
	// this check.
	Name string `json:"name,omitempty"`
}

// CheckDynamicAddress contains the InstanceKey field for any resources that
// have multiple instances. A complete address can be built by combining the
// CheckStaticAddress with the CheckDynamicAddress.
type CheckDynamicAddress struct {
	// ToDisplay is a formatted and ready to display representation of the
	// full address, including the additional information from the relevant
	// CheckStaticAddress.
	ToDisplay string `json:"to_display"`

	// Module is the module part of the address. This address will include the
	// instance key for any module expansions resulting from foreach or count
	// arguments. This field will be empty for any resources within the root
	// module.
	Module string `json:"module,omitempty"`

	// InstanceKey is the instance key for any instances of a given resource.
	//
	// InstanceKey will be empty if there was no foreach or count argument
	// defined on the containing object.
	InstanceKey interface{} `json:"instance_key,omitempty"`
}

// CheckResultStatic is the container for a "checkable object".
//
// A "checkable object" is a resource or data source, an output, or a check
// block.
type CheckResultStatic struct {
	// Address is the absolute address of the "checkable object"
	Address CheckStaticAddress `json:"address"`

	// Status is the overall status for all the checks within this object.
	Status CheckStatus `json:"status"`

	// Instances contains the results for dynamic object that belongs to this
	// static object. For example, any instances created from an object using
	// the foreach or count meta arguments.
	//
	// Check blocks and outputs will only contain a single instance, while
	// resources can contain 1 to many.
	Instances []CheckResultDynamic `json:"instances,omitempty"`
}

// CheckResultDynamic describes the check result for a dynamic object that
// results from the expansion of the containing object.
type CheckResultDynamic struct {
	// Address is the relative address of this instance given the Address in the
	// parent object.
	Address CheckDynamicAddress `json:"address"`

	// Status is the overall status for the checks within this dynamic object.
	Status CheckStatus `json:"status"`

	// Problems describes any additional optional details about this check if
	// the check failed.
	//
	// This will not include the errors resulting from this check block, as they
	// will be exposed as diagnostics in the original terraform execution. It
	// may contain any failure messages even if the overall status is
	// CheckStatusError, however, as the instance could contain multiple checks
	// that returned a mix of error and failure statuses.
	Problems []CheckResultProblem `json:"problems,omitempty"`
}

// CheckResultProblem describes one of potentially several problems that led to
// a check being classied as CheckStatusFail.
type CheckResultProblem struct {
	// Message is the condition error message provided by the original check
	// author.
	Message string `json:"message"`
}
