// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package checks

import (
	"regexp"
	"strings"

	"golang.org/x/tools/go/analysis"
)

var (
	header     = regexp.MustCompile(`.*Copyright.*\d{4}.*(Gitea|Gogs)`)
	goGenerate = "//go:generate"
	buildTag   = "// +build"
)

var License = &analysis.Analyzer{
	Name: "license",
	Doc:  "check for a copyright header",
	Run:  runLicense,
}

func runLicense(pass *analysis.Pass) (interface{}, error) {
	for _, file := range pass.Files {
		if len(file.Comments) == 0 {
			pass.Reportf(file.Pos(), "Copyright not found")
			continue
		}

		if len(file.Comments[0].List) == 0 {
			pass.Reportf(file.Pos(), "Copyright not found or wrong")
			continue
		}

		commentGroup := 0
		if strings.HasPrefix(file.Comments[0].List[0].Text, goGenerate) {
			if len(file.Comments[0].List) > 1 {
				pass.Reportf(file.Pos(), "Must be an empty line between the go:generate and the Copyright")
				continue
			}
			commentGroup++
		}

		if strings.HasPrefix(file.Comments[0].List[0].Text, buildTag) {
			commentGroup++
		}

		if len(file.Comments) < commentGroup+1 {
			pass.Reportf(file.Pos(), "Copyright not found")
			continue
		}

		if len(file.Comments[commentGroup].List) < 1 {
			pass.Reportf(file.Pos(), "Copyright not found or wrong")
			continue
		}

		var check bool
		for _, comment := range file.Comments[commentGroup].List {
			if header.MatchString(comment.Text) {
				check = true
			}
		}

		if !check {
			pass.Reportf(file.Pos(), "Copyright did not match check")
		}
	}
	return nil, nil
}