package analyzererrors

import (
	"errors"
	"fmt"

	contractevents "bit.admedia.com/scm/ad/adpilot-indexing-code-parser.com/internal/contracts/events"
)

// ParseError carries structured parser diagnostics for a failed parse.
type ParseError struct {
	Diagnostics []contractevents.ParserDiagnostic
	Cause       error
}

func (e *ParseError) Error() string {
	if e.Cause != nil {
		return fmt.Sprintf("parse failed: %v", e.Cause)
	}
	if len(e.Diagnostics) > 0 {
		return e.Diagnostics[0].Message
	}
	return "parse failed"
}

func (e *ParseError) Unwrap() error {
	return e.Cause
}

// DiagnosticsFromError returns analyzer diagnostics when err wraps ParseError.
func DiagnosticsFromError(err error) []contractevents.ParserDiagnostic {
	var parseErr *ParseError
	if errors.As(err, &parseErr) {
		return parseErr.Diagnostics
	}
	return nil
}
