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

import (
	"bytes"
	"encoding/json"
	"time"
)

// LogMessageLevel represents log level
// See https://github.com/hashicorp/go-hclog/blob/v1.6.3/logger.go#L126-L145
type LogMessageLevel string

const (
	// Trace is the most verbose level. Intended to be used for the tracing
	// of actions in code, such as function enters/exits, etc.
	Trace LogMessageLevel = "trace"

	// Debug information for programmer low-level analysis.
	Debug LogMessageLevel = "debug"

	// Info information about steady state operations.
	Info LogMessageLevel = "info"

	// Warn information about rare but handled events.
	Warn LogMessageLevel = "warn"

	// Error information about unrecoverable events.
	Error LogMessageLevel = "error"
)

// LogMessage represents a log message emitted from commands
// which support structured log output.
//
// This is implemented via hashicorp/go-hclog which
// defines the format.
type LogMsg interface {
	Level() LogMessageLevel
	Message() string
	Timestamp() time.Time
}

type baseLogMessage struct {
	Lvl  LogMessageLevel `json:"@level"`
	Msg  string          `json:"@message"`
	Time time.Time       `json:"@timestamp"`
}

type msgType struct {
	// Type represents a message type
	// which is documented at https://developer.hashicorp.com/terraform/internals/machine-readable-ui#message-types
	Type LogMessageType `json:"type"`
}

func (m baseLogMessage) Level() LogMessageLevel {
	return m.Lvl
}

func (m baseLogMessage) Message() string {
	return m.Msg
}

func (m baseLogMessage) Timestamp() time.Time {
	return m.Time
}

// UnknownLogMessage represents a message of unknown type
type UnknownLogMessage struct {
	baseLogMessage
}

func UnmarshalLogMessage(b []byte) (LogMsg, error) {
	d := json.NewDecoder(bytes.NewReader(b))

	mt := msgType{}
	err := d.Decode(&mt)
	if err != nil {
		return nil, err
	}

	v, err := unmarshalByType(mt.Type, b)
	return v, err
}
