package earlyconfig

import (
	"fmt"

	"github.com/hashicorp/terraform-config-inspect/tfconfig"
	"github.com/hashicorp/terraform/internal/tfdiags"
)

func wrapDiagnostics(diags tfconfig.Diagnostics) tfdiags.Diagnostics {
	ret := make(tfdiags.Diagnostics, len(diags))
	for i, diag := range diags {
		ret[i] = wrapDiagnostic(diag)
	}
	return ret
}

func wrapDiagnostic(diag tfconfig.Diagnostic) tfdiags.Diagnostic {
	return wrappedDiagnostic{
		d: diag,
	}
}

type wrappedDiagnostic struct {
	d tfconfig.Diagnostic
}

func (d wrappedDiagnostic) Severity() tfdiags.Severity {
	switch d.d.Severity {
	case tfconfig.DiagError:
		return tfdiags.Error
	case tfconfig.DiagWarning:
		return tfdiags.Warning
	default:
		// Should never happen since there are no other severities
		return 0
	}
}

func (d wrappedDiagnostic) Description() tfdiags.Description {
	// Since the inspect library doesn't produce precise source locations,
	// we include the position information as part of the error message text.
	// See the comment inside method "Source" for more information.
	switch {
	case d.d.Pos == nil:
		return tfdiags.Description{
			Summary: d.d.Summary,
			Detail:  d.d.Detail,
		}
	case d.d.Detail != "":
		return tfdiags.Description{
			Summary: d.d.Summary,
			Detail:  fmt.Sprintf("On %s line %d: %s", d.d.Pos.Filename, d.d.Pos.Line, d.d.Detail),
		}
	default:
		return tfdiags.Description{
			Summary: fmt.Sprintf("%s (on %s line %d)", d.d.Summary, d.d.Pos.Filename, d.d.Pos.Line),
		}
	}
}

func (d wrappedDiagnostic) Source() tfdiags.Source {
	// Since the inspect library is constrained by the lowest common denominator
	// between legacy HCL and modern HCL, it only returns ranges at whole-line
	// granularity, and that isn't sufficient to populate a tfdiags.Source
	// and so we'll just omit ranges altogether and include the line number in
	// the Description text.
	//
	// Callers that want to return nicer errors should consider reacting to
	// earlyconfig errors by attempting a follow-up parse with the normal
	// config loader, which can produce more precise source location
	// information.
	return tfdiags.Source{}
}

func (d wrappedDiagnostic) FromExpr() *tfdiags.FromExpr {
	return nil
}

func (d wrappedDiagnostic) ExtraInfo() interface{} {
	return nil
}
