package tenant

import (
	"context"
	"time"

	domaintenant "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/domain/tenant"
)

// GetTenantInput represents the input for getting a tenant
type GetTenantInput struct {
	ID string
}

// GetTenantBySlugInput represents the input for getting a tenant by slug
type GetTenantBySlugInput struct {
	Slug string
}

// GetTenantOutput represents the output after getting a tenant
type GetTenantOutput struct {
	ID        string
	Name      string
	Slug      string
	Status    string
	CreatedAt time.Time
	UpdatedAt time.Time
}

// GetTenantUseCase handles tenant retrieval business logic
type GetTenantUseCase struct {
	repo domaintenant.Repository
}

// ProvideGetTenantUseCase creates a new GetTenantUseCase
func ProvideGetTenantUseCase(repo domaintenant.Repository) *GetTenantUseCase {
	return &GetTenantUseCase{repo: repo}
}

// Execute retrieves a tenant by ID
func (uc *GetTenantUseCase) Execute(ctx context.Context, input *GetTenantInput) (*GetTenantOutput, error) {
	tenant, err := uc.repo.GetByID(ctx, input.ID)
	if err != nil {
		return nil, err
	}

	return &GetTenantOutput{
		ID:        tenant.ID,
		Name:      tenant.Name,
		Slug:      tenant.Slug,
		Status:    string(tenant.Status),
		CreatedAt: tenant.CreatedAt,
		UpdatedAt: tenant.UpdatedAt,
	}, nil
}

// ExecuteBySlug retrieves a tenant by slug
func (uc *GetTenantUseCase) ExecuteBySlug(ctx context.Context, input *GetTenantBySlugInput) (*GetTenantOutput, error) {
	tenant, err := uc.repo.GetBySlug(ctx, input.Slug)
	if err != nil {
		return nil, err
	}

	return &GetTenantOutput{
		ID:        tenant.ID,
		Name:      tenant.Name,
		Slug:      tenant.Slug,
		Status:    string(tenant.Status),
		CreatedAt: tenant.CreatedAt,
		UpdatedAt: tenant.UpdatedAt,
	}, nil
}
