package main

import (
	"fmt"

	"go.wit.com/lib/gui/shell"
	"go.wit.com/lib/protobuf/gitpb"
	"go.wit.com/log"
)

// you can replace all of COBOL with this amount of GO

// ah yes, COBOL. what an ancient throwback. for those that know
// then you know exactly what is in this file. For those that don't, here it is:

// All this does is output human readable text formatted to be viewable on
// a console with a fixed with font. AKA: a typerwriter. Which is exactly
// what COBOL did in the 1970's (60s? notsure) And the 80s.

// So, you want to dump out stuff on the console. Let's see. Something like

/*
	forge --favorites

	go.wit.com/apps/myapp          v0.2.0     (installed)
	go.wit.com/lib/somethingfun    v0.0.7     (not downloaded)
*/

// anyway, you get the idea. This is also called COBOL because it does on
// thing and truncates every line output to the columns you see with stty -a
// my monitor is huge, so it's not going to work at 80x24. 160x48 is better
// actually, I'd predict some of these will probably end up 240 wide
// long live good eyesight and 4K monitors!

func doHumanTable() {
	log.DaemonMode(true)

	// log.Info(standardStart5("gopath", "cur name", "master", "user", "repo type"))
	log.Info(standardTable8("repopath", "cur br", "age", "target", "master", "devel", "user", "curver", "repo type"))
	all := me.found.SortByFullPath()
	for all.Scan() {
		repo := all.Next()
		sendRepoToTable(repo)
	}
}

func standardTable5(arg1, arg2, arg3, arg4, arg5 string) string {
	len1 := 40
	len2 := 12
	len3 := 12
	len4 := 16
	len5 := 8
	var s string
	if len(arg1) > len1 {
		arg1 = arg1[:len1]
	}
	s = "%-" + fmt.Sprintf("%d", len1) + "s "
	if len(arg2) > len2 {
		arg2 = arg2[:len2]
	}
	s += "%-" + fmt.Sprintf("%d", len2) + "s "
	if len(arg3) > len3 {
		arg3 = arg3[:len3]
	}
	s += "%-" + fmt.Sprintf("%d", len3) + "s "
	if len(arg4) > len4 {
		arg4 = arg4[:len4]
	}
	s += "%-" + fmt.Sprintf("%d", len4) + "s "
	if len(arg5) > len5 {
		arg5 = arg5[:len5]
	}
	s += "%-" + fmt.Sprintf("%d", len5) + "s"
	return fmt.Sprintf(s, arg1, arg2, arg3, arg4, arg5)
}

func standardTable8(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 string) string {
	len1 := 40
	len2 := 12
	len3 := 6
	len4 := 12
	len5 := 16
	len6 := 16
	len7 := 16
	len8 := 16
	len9 := 8
	var s string
	if len(arg1) > len1 {
		arg1 = arg1[:len1]
	}
	s = "%-" + fmt.Sprintf("%d", len1) + "s "
	if len(arg2) > len2 {
		arg2 = arg2[:len2]
	}
	s += "%-" + fmt.Sprintf("%d", len2) + "s "
	if len(arg3) > len3 {
		arg3 = arg3[:len3]
	}
	s += "%-" + fmt.Sprintf("%d", len3) + "s "
	if len(arg4) > len4 {
		arg4 = arg4[:len4]
	}
	s += "%-" + fmt.Sprintf("%d", len4) + "s "

	if len(arg5) > len5 {
		arg5 = arg5[:len5]
	}
	s += "%-" + fmt.Sprintf("%d", len5) + "s "

	if len(arg6) > len6 {
		arg6 = arg6[:len6]
	}
	s += "%-" + fmt.Sprintf("%d", len6) + "s "

	if len(arg7) > len7 {
		arg7 = arg7[:len7]
	}
	s += "%-" + fmt.Sprintf("%d", len7) + "s "

	if len(arg8) > len8 {
		arg8 = arg8[:len8]
	}
	s += "%-" + fmt.Sprintf("%d", len8) + "s "

	if len(arg9) > len9 {
		arg9 = arg9[:len9]
	}
	s += "%-" + fmt.Sprintf("%d", len9) + "s "

	return fmt.Sprintf(s, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
}

func sendRepoToTable(repo *gitpb.Repo) {
	var end string
	if repo.IsDirty() {
		end += "(dirty) "
	}
	var mhort string = repo.GetMasterVersion()
	var dhort string = repo.GetDevelVersion()
	var uhort string = repo.GetUserVersion()
	var thort string = repo.GetTargetVersion()
	var chort string = repo.GetCurrentBranchVersion()
	var cname string = repo.GetCurrentBranchName()

	var gopath string = repo.GetGoPath()
	var rtype string = repo.GetRepoType()

	age := shell.FormatDuration(repo.NewestAge())

	start := standardTable8(gopath, cname, age, thort, mhort, dhort, uhort, chort, rtype)

	if me.forge.Config.IsReadOnly(repo.GetGoPath()) {
		end += "(readonly) "
	}
	if repo.GetMasterBranchName() != "master" && repo.GetMasterBranchName() != "main" {
		end += "(m:" + repo.GetMasterBranchName() + ") "
	}

	log.Info(start, end)
}