package main

import (
	"errors"
	"fmt"
	"log"
	"os"
	"strings"

	"wucher/internal/config"
)

const (
	workerJobEnvKey           = "WORKER_JOB"
	workerJobEmail            = "email"
	workerJobFileProcessing   = "file_processing"
	workerJobAliasMail        = "mail"
	workerJobAliasEmailWorker = "email_worker"
	workerJobAliasFile        = "file"
	workerJobAliasFileWorker  = "file_worker"
)

var (
	workerRunFn     = run
	workerFatalFn   = log.Fatal
	runMailWorkerFn func(config.AppConfig) error = runMailWorker
	runFileWorkerFn func(config.AppConfig) error = runFileWorker
)

func configFilePath() string {
	if v := os.Getenv("CONFIG_FILE"); v != "" {
		return v
	}
	basePath := os.Getenv("CONFIG_BASE_PATH")
	if basePath == "" {
		basePath = "/tmp"
	}
	filename := os.Getenv("CONFIG_FILENAME")
	if filename == "" {
		filename = "config.generated.json"
	}
	return basePath + "/" + filename
}

func main() {
	if err := workerRunFn(); err != nil {
		workerFatalFn(err)
	}
}

func run() error {
	appCfg, err := config.LoadFromFile(configFilePath())
	if err != nil {
		return fmt.Errorf("load config: %w", err)
	}

	job := normalizeWorkerJob(os.Getenv(workerJobEnvKey))

	switch job {
	case workerJobEmail:
		return runMailWorkerFn(appCfg)
	case workerJobFileProcessing:
		return runFileWorkerFn(appCfg)
	default:
		return errors.New("unsupported worker job: " + job)
	}
}

func normalizeWorkerJob(raw string) string {
	job := strings.ToLower(strings.TrimSpace(raw))

	switch job {
	case "", workerJobEmail, workerJobAliasMail, workerJobAliasEmailWorker:
		return workerJobEmail
	case workerJobFileProcessing, workerJobAliasFile, workerJobAliasFileWorker:
		return workerJobFileProcessing
	default:
		return job
	}
}
