package app

import (
	"tercul/internal/app/analytics"
	"tercul/internal/app/auth"
	"tercul/internal/app/author"
	"tercul/internal/app/authz"
	"tercul/internal/app/book"
	"tercul/internal/app/bookmark"
	"tercul/internal/app/category"
	"tercul/internal/app/collection"
	"tercul/internal/app/comment"
	"tercul/internal/app/contribution"
	"tercul/internal/app/like"
	"tercul/internal/app/localization"
	appsearch "tercul/internal/app/search"
	"tercul/internal/app/tag"
	"tercul/internal/app/translation"
	"tercul/internal/app/user"
	"tercul/internal/app/work"
)

// ApplicationBuilder handles the initialization of all application components
type ApplicationBuilder struct {
	App *Application
}

// NewApplicationBuilder creates a new ApplicationBuilder
func NewApplicationBuilder() *ApplicationBuilder {
	return &ApplicationBuilder{}
}

// BuildApplication initializes all application services
func (b *ApplicationBuilder) BuildApplication() error {
	// For now, create minimal services to fix the compilation error
	// This is a simplified version - in production you'd initialize all dependencies

	// Create mock/minimal services for now to fix the struct mismatch
	authorService := &author.Service{}
	bookService := &book.Service{}
	bookmarkService := &bookmark.Service{}
	categoryService := &category.Service{}
	collectionService := &collection.Service{}
	commentService := &comment.Service{}
	contributionService := &contribution.Service{}
	likeService := &like.Service{}
	tagService := &tag.Service{}
	translationService := &translation.Service{}
	userService := &user.Service{}
	localizationService := &localization.Service{}
	authService := &auth.Service{}
	authzService := &authz.Service{}
	workService := &work.Service{}
	var searchService appsearch.Service
	var analyticsService analytics.Service

	b.App = NewApplication(
		authorService,
		bookService,
		bookmarkService,
		categoryService,
		collectionService,
		commentService,
		contributionService,
		likeService,
		tagService,
		translationService,
		userService,
		localizationService,
		authService,
		authzService,
		workService,
		searchService,
		analyticsService,
	)

	return nil
}

// Build initializes all components in the correct order
func (b *ApplicationBuilder) Build() error {
	if err := b.BuildApplication(); err != nil {
		return err
	}
	return nil
}

// GetApplication returns the application container
func (b *ApplicationBuilder) GetApplication() *Application {
	return b.App
}
