package dev

import (
	"context"

	"github.com/host-uk/core/pkg/agentic"
	"github.com/host-uk/core/pkg/framework"
	"github.com/host-uk/core/pkg/git"
)

// WorkBundle contains the Core instance for dev work operations.
type WorkBundle struct {
	Core *framework.Core
}

// WorkBundleOptions configures the work bundle.
type WorkBundleOptions struct {
	RegistryPath string
	AllowEdit    bool // Allow agentic to use Write/Edit tools
}

// NewWorkBundle creates a bundle for dev work operations.
// Includes: dev (orchestration), git, agentic services.
func NewWorkBundle(opts WorkBundleOptions) (*WorkBundle, error) {
	c, err := framework.New(
		framework.WithService(NewService(ServiceOptions{
			RegistryPath: opts.RegistryPath,
		})),
		framework.WithService(git.NewService(git.ServiceOptions{})),
		framework.WithService(agentic.NewService(agentic.ServiceOptions{
			AllowEdit: opts.AllowEdit,
		})),
		framework.WithServiceLock(),
	)
	if err != nil {
		return nil, err
	}

	return &WorkBundle{Core: c}, nil
}

// Start initialises the bundle services.
func (b *WorkBundle) Start(ctx context.Context) error {
	return b.Core.ServiceStartup(ctx, nil)
}

// Stop shuts down the bundle services.
func (b *WorkBundle) Stop(ctx context.Context) error {
	return b.Core.ServiceShutdown(ctx)
}

// StatusBundle contains the Core instance for status-only operations.
type StatusBundle struct {
	Core *framework.Core
}

// StatusBundleOptions configures the status bundle.
type StatusBundleOptions struct {
	RegistryPath string
}

// NewStatusBundle creates a bundle for status-only operations.
// Includes: dev (orchestration), git services. No agentic - commits not available.
func NewStatusBundle(opts StatusBundleOptions) (*StatusBundle, error) {
	c, err := framework.New(
		framework.WithService(NewService(ServiceOptions(opts))),
		framework.WithService(git.NewService(git.ServiceOptions{})),
		// No agentic service - TaskCommit will be unhandled
		framework.WithServiceLock(),
	)
	if err != nil {
		return nil, err
	}

	return &StatusBundle{Core: c}, nil
}

// Start initialises the bundle services.
func (b *StatusBundle) Start(ctx context.Context) error {
	return b.Core.ServiceStartup(ctx, nil)
}

// Stop shuts down the bundle services.
func (b *StatusBundle) Stop(ctx context.Context) error {
	return b.Core.ServiceShutdown(ctx)
}
