package source

import (
	"context"

	"golang.org/x/tools/go/analysis"
	"golang.org/x/tools/internal/lsp/protocol"
	"golang.org/x/tools/internal/span"
)

func getCodeActions(ctx context.Context, view View, pkg Package, diag analysis.Diagnostic) ([]SuggestedFix, error) {
	var fixes []SuggestedFix
	for _, fix := range diag.SuggestedFixes {
		var edits []protocol.TextEdit
		for _, e := range fix.TextEdits {
			posn := view.Session().Cache().FileSet().Position(e.Pos)
			ph, _, err := pkg.FindFile(ctx, span.FileURI(posn.Filename))
			if err != nil {
				return nil, err
			}
			_, m, err := ph.Cached(ctx)
			if m == nil {
				return nil, err
			}
			mrng, err := posToRange(ctx, view, m, e.Pos, e.End)
			if err != nil {
				return nil, err
			}
			rng, err := mrng.Range()
			if err != nil {
				return nil, err
			}
			edits = append(edits, protocol.TextEdit{
				Range:   rng,
				NewText: string(e.NewText),
			})
		}
		fixes = append(fixes, SuggestedFix{
			Title: fix.Message,
			Edits: edits,
		})
	}
	return fixes, nil
}
