package app

import (
	"fmt"
	"log/slog"

	"github.com/iomodo/staff/agent"
	"github.com/iomodo/staff/config"
	"github.com/iomodo/staff/git"
	"github.com/iomodo/staff/tm"
	"github.com/iomodo/staff/tm/git_tm"
)

// App type defines application global state
type App struct {
	logger      *slog.Logger
	config      *config.Config
	manager     *agent.Manager
	git         git.GitInterface
	taskManager tm.TaskManager
}

// NewApp creates new App
func NewApp(config *config.Config, logger *slog.Logger) (*App, error) {
	// Create task manager using config
	gitInterface := git.New(config, logger)
	taskManager := git_tm.NewGitTaskManager(gitInterface, config, logger)

	manager, err := agent.NewManager(config, taskManager, logger)
	if err != nil {
		return nil, fmt.Errorf("failed to create agent manager: %w", err)
	}

	return &App{
		logger:      logger,
		config:      config,
		manager:     manager,
		git:         gitInterface,
		taskManager: taskManager,
	}, nil
}

func (a *App) Start() {
	a.manager.StartAllAgents()
}

func (a *App) Stop() {
	if a.manager != nil {
		if err := a.manager.Close(); err != nil {
			a.logger.Error("Error closing manager", slog.String("error", err.Error()))
		}
	}
}
