package orchestrator

import (
	"context"
	"fmt"
)

// Orchestrator orchestrates VTM workflows
type Orchestrator struct {
	workflows map[string]Workflow
}

// NewOrchestrator creates a new orchestrator
func NewOrchestrator() *Orchestrator {
	return &Orchestrator{
		workflows: make(map[string]Workflow),
	}
}

// Workflow interface for VTM workflows
type Workflow interface {
	Execute(ctx context.Context, input map[string]interface{}) (*WorkflowResult, error)
	Name() string
}

// WorkflowResult represents workflow execution result
type WorkflowResult struct {
	Status      string
	NextStep    string
	Data        map[string]interface{}
	RequiresInput bool
}

// RegisterWorkflow registers a workflow
func (o *Orchestrator) RegisterWorkflow(workflow Workflow) {
	o.workflows[workflow.Name()] = workflow
}

// ExecuteWorkflow executes a workflow
func (o *Orchestrator) ExecuteWorkflow(ctx context.Context, workflowName string, input map[string]interface{}) (*WorkflowResult, error) {
	workflow, ok := o.workflows[workflowName]
	if !ok {
		return nil, fmt.Errorf("workflow not found: %s", workflowName)
	}

	return workflow.Execute(ctx, input)
}

// AccountOpeningWorkflow implements Workflow for account opening
type AccountOpeningWorkflow struct{}

func NewAccountOpeningWorkflow() *AccountOpeningWorkflow {
	return &AccountOpeningWorkflow{}
}

func (w *AccountOpeningWorkflow) Name() string {
	return "account_opening"
}

func (w *AccountOpeningWorkflow) Execute(ctx context.Context, input map[string]interface{}) (*WorkflowResult, error) {
	// Implementation would handle account opening workflow
	return &WorkflowResult{
		Status:      "in_progress",
		NextStep:    "kyc_verification",
		Data:        make(map[string]interface{}),
		RequiresInput: true,
	}, nil
}

