package main

import (
	"github.com/Benjamin2037/tipoc-tv/core/execution"
	"github.com/Benjamin2037/tipoc-tv/core/operation"
	"github.com/Benjamin2037/tipoc-tv/core/scenario"
	internetbigquery "github.com/Benjamin2037/tipoc-tv/industries/internet/platform/operations/big_query"
	internetmissingindex "github.com/Benjamin2037/tipoc-tv/industries/internet/platform/operations/missing_index"
	internetmaintenance "github.com/Benjamin2037/tipoc-tv/industries/internet/platform/operations/schema_maintenance"
	bigquery "github.com/Benjamin2037/tipoc-tv/industries/securities/operations/big_query"
	recenttradestatus "github.com/Benjamin2037/tipoc-tv/industries/securities/operations/recent_trade_status"
	securitiesmaintenance "github.com/Benjamin2037/tipoc-tv/industries/securities/operations/schema_maintenance"
)

type operationExecutionMode string

func (mode operationExecutionMode) ID() string { return string(mode) }

// applicationWiring holds composition-root dependencies shared by later
// compiler and execution lifecycle integration.
type applicationWiring struct {
	OperationRegistry operation.Registry
}

func newApplicationWiring() (applicationWiring, error) {
	registry, err := newOperationRegistry()
	if err != nil {
		return applicationWiring{}, err
	}
	return applicationWiring{OperationRegistry: registry}, nil
}

func (w applicationWiring) compiler() scenario.Compiler {
	return scenario.NewCompiler(w.OperationRegistry)
}

func (w applicationWiring) executor() execution.Executor {
	executor := execution.NewExecutor()
	executor.OperationRegistry = w.OperationRegistry
	return executor
}

// newOperationRegistry declares the production catalog explicitly.
func newOperationRegistry() (operation.Registry, error) {
	return operation.NewRegistry(
		[]operation.Definition{
			internetbigquery.NewDefinition(), internetmissingindex.NewDefinition(), internetmaintenance.NewDefinition(), bigquery.NewDefinition(),
			recenttradestatus.NewDefinition(), securitiesmaintenance.NewDefinition(),
		},
		[]operation.ExecutionMode{
			operationExecutionMode(operation.ActionOnlyExecutionModeID),
			operationExecutionMode(bigquery.ExecutionModeID),
			operationExecutionMode(recenttradestatus.ExecutionModeID),
		},
	)
}
