package gitpb

//
// DOES NOT MODIFY FILES
//
// only reads in the go.mod file. doesn't change anything

import (
	"bufio"
	"errors"
	"os"
	"path/filepath"
	"strings"

	"go.wit.com/log"
)

// deprecate use of IsPrimitive() to this function
// this assumes go.mod and go.sum are in a releasable state
func (repo *Repo) setPrimitive() error {
	_, err := repo.computePrimitive()
	return err
}

// Detect a 'Primitive' package. Sets the isPrimitive flag
// will return true if the repo is truly not dependent on _anything_ else
// like spew or lib/widget
// it assumes go mod ran init and tidy ran without error
func (repo *Repo) computePrimitive() (bool, error) {
	// go mod init & go mod tidy ran without errors
	log.Log(INFO, "isPrimitiveGoMod()", repo.FullPath)
	tmp := filepath.Join(repo.FullPath, "go.mod")
	gomod, err := os.Open(tmp)
	if err != nil {
		log.Log(INFO, "missing go.mod", repo.FullPath)
		return false, err
	}
	defer gomod.Close()

	if repo.Exists("go.sum") {
		repo.GoInfo.GoPrimitive = false
		return false, nil
	}

	scanner := bufio.NewScanner(gomod)
	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())

		parts := strings.Fields(line)
		log.Log(INFO, "  gomod:", parts)
		if len(parts) >= 1 {
			log.Log(INFO, "  gomod: part[0] =", parts[0])
			if parts[0] == "require" {
				log.Log(INFO, "  should return false here")
				return false, errors.New("go.mod file is not primitive")
			}
			/*
				if parts[0] == "go" {
					if parts[1] != "1.21" {
						log.Log(WARN, "go not set to 1.21 for", repo.GetGoPath())
						// return false, errors.New("go not set to 1.21 for " + repo.GetGoPath())
					}
				}
			*/
		}
	}
	repo.GoInfo.GoPrimitive = true
	repo.GoDeps = nil
	return true, nil
}