package golinters

import (
	"context"
	"go/token"
	"strings"

	"github.com/golangci/golangci-lint/pkg/lint/linter"
	"github.com/golangci/golangci-lint/pkg/result"

	"github.com/ultraware/funlen"
)

type Funlen struct{}

func (Funlen) Name() string {
	return "funlen"
}

func (Funlen) Desc() string {
	return "Tool for detection of long functions"
}

func (f Funlen) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
	var issues []funlen.Message
	for _, file := range lintCtx.ASTCache.GetAllValidFiles() {
		issues = append(issues, funlen.Run(file.F, file.Fset, lintCtx.Settings().Funlen.Lines, lintCtx.Settings().Funlen.Statements)...)
	}

	if len(issues) == 0 {
		return nil, nil
	}

	res := make([]result.Issue, len(issues))
	for k, i := range issues {
		res[k] = result.Issue{
			Pos: token.Position{
				Filename: i.Pos.Filename,
				Line:     i.Pos.Line,
			},
			Text:       strings.TrimRight(i.Message, "\n"),
			FromLinter: f.Name(),
		}
	}

	return res, nil
}