package utils

import (
	"fmt"
	"strings"

	log "github.com/sirupsen/logrus"
)

var masker func(string) = nil

func MaskSensitiveGithubOutput(sensitive string) {
	if masker != nil && len(sensitive) > 0 {
		masker(sensitive)
	}
}

func SetGithubMasker() {
	masker = maskByGithub
}

func maskByGithub(sensitive string) {
	for _, s := range strings.Split(sensitive, "\n") {
		fmt.Printf("::add-mask::%s\n", s)
	}
}

func SetLoggerMasker() {
	masker = maksByLogger
	log.AddHook(&hooker)
}

func maksByLogger(sensitive string) {
	hooker.sensitiveList = append(hooker.sensitiveList, sensitive)
}

var hooker = logHooker{}

type logHooker struct {
	sensitiveList []string
}

func (h *logHooker) Levels() []log.Level {
	return log.AllLevels
}

func (h *logHooker) Fire(e *log.Entry) error {
	for _, s := range h.sensitiveList {
		e.Message = strings.Replace(e.Message, s, "***", -1)
	}
	for i, data := range e.Data {
		if strData, ok := data.(string); ok { // only string data
			for _, s := range h.sensitiveList {
				e.Data[i] = strings.Replace(strData, s, "***", -1)
			}
		}
	}
	return nil
}
