package main

import (
	"flag"
	"os"

	log "github.com/sirupsen/logrus"

	"github.com/trustwallet/assets-go-libs/pkg/file"
	"github.com/trustwallet/assets-go-libs/src/config"
	"github.com/trustwallet/assets-go-libs/src/processor"
	"github.com/trustwallet/assets-go-libs/src/reporter"
	"github.com/trustwallet/assets-go-libs/src/validator"
)

var (
	configPath, root, script string
)

func main() {
	setup()

	paths, err := file.ReadLocalFileStructure(root, config.Default.ValidatorsSettings.RootFolder.SkipFiles)
	if err != nil {
		log.WithError(err).Fatal("failed to load file structure")
	}

	fileStorage := file.NewFileService()
	validatorsService := validator.NewService(fileStorage)
	reportService := reporter.NewReportService()
	assetfsProcessor := processor.NewService(fileStorage, validatorsService, reportService)

	switch script {
	case "sanity-check":
		err = assetfsProcessor.RunSanityCheck(paths)
	default:
		log.Error("Nothing to launch. Use --script flag to choose a script to run.")
	}

	if err != nil {
		log.WithError(err).Error()
	}

	reports := reportService.GetReports()
	for key, report := range reports {
		log.WithFields(log.Fields{
			"total_files": report.TotalFiles,
			"errors":      report.Errors,
			"warnings":    report.Warnings,
			"fixed":       report.Fixed,
		}).Info(key)

		if report.Errors > 0 {
			os.Exit(1)
		}
	}

}

func setup() {
	flag.StringVar(&configPath, "config", "", "path to config file")
	flag.StringVar(&root, "root", "./", "path to the root of the dir")
	flag.StringVar(&script, "script", "", "script type to run")
	flag.Parse()

	if err := config.SetConfig(configPath); err != nil {
		log.WithError(err).Fatal("failed to set config")
	}

	logLevel, err := log.ParseLevel(config.Default.App.LogLevel)
	if err != nil {
		log.WithError(err).Fatal("failed to parse log level")
	}

	log.SetLevel(logLevel)
}