package com.social.media.application.bot.service;

import com.social.media.application.bot.command.*;
import com.social.media.application.bot.dto.BotResponseDto;
import com.social.media.application.bot.handler.*;
import com.social.media.application.bot.query.*;
import com.social.media.domain.bot.valueobject.BotId;
import com.social.media.domain.bot.valueobject.BotStatus;
import com.social.media.domain.bot.valueobject.BotType;
import com.social.media.domain.company.valueobject.CompanyId;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Application Service for Bot Automation Context
 * Orchestrates commands and queries through dedicated handlers
 */
@Service
public class BotApplicationService {
    
    private final CreateBotCommandHandler createBotCommandHandler;
    private final UpdateBotCommandHandler updateBotCommandHandler;
    private final ActivateBotCommandHandler activateBotCommandHandler;
    private final DeactivateBotCommandHandler deactivateBotCommandHandler;
    private final StartBotCommandHandler startBotCommandHandler;
    private final StopBotCommandHandler stopBotCommandHandler;
    private final DeleteBotCommandHandler deleteBotCommandHandler;
    private final GetBotByIdQueryHandler getBotByIdQueryHandler;
    private final GetBotsByCompanyQueryHandler getBotsByCompanyQueryHandler;
    private final GetActiveBotsQueryHandler getActiveBotsQueryHandler;
    
    public BotApplicationService(
            CreateBotCommandHandler createBotCommandHandler,
            UpdateBotCommandHandler updateBotCommandHandler,
            ActivateBotCommandHandler activateBotCommandHandler,
            DeactivateBotCommandHandler deactivateBotCommandHandler,
            StartBotCommandHandler startBotCommandHandler,
            StopBotCommandHandler stopBotCommandHandler,
            DeleteBotCommandHandler deleteBotCommandHandler,
            GetBotByIdQueryHandler getBotByIdQueryHandler,
            GetBotsByCompanyQueryHandler getBotsByCompanyQueryHandler,
            GetActiveBotsQueryHandler getActiveBotsQueryHandler) {
        this.createBotCommandHandler = createBotCommandHandler;
        this.updateBotCommandHandler = updateBotCommandHandler;
        this.activateBotCommandHandler = activateBotCommandHandler;
        this.deactivateBotCommandHandler = deactivateBotCommandHandler;
        this.startBotCommandHandler = startBotCommandHandler;
        this.stopBotCommandHandler = stopBotCommandHandler;
        this.deleteBotCommandHandler = deleteBotCommandHandler;
        this.getBotByIdQueryHandler = getBotByIdQueryHandler;
        this.getBotsByCompanyQueryHandler = getBotsByCompanyQueryHandler;
        this.getActiveBotsQueryHandler = getActiveBotsQueryHandler;
    }
    
    // Command Operations
    
    /**
     * Create a new bot
     */
    public BotResponseDto createBot(CreateBotCommand command) {
        return createBotCommandHandler.handle(command);
    }
    
    /**
     * Update an existing bot
     */
    public BotResponseDto updateBot(UpdateBotCommand command) {
        return updateBotCommandHandler.handle(command);
    }
    
    /**
     * Activate a bot
     */
    public BotResponseDto activateBot(ActivateBotCommand command) {
        return activateBotCommandHandler.handle(command);
    }
    
    /**
     * Deactivate a bot
     */
    public BotResponseDto deactivateBot(DeactivateBotCommand command) {
        return deactivateBotCommandHandler.handle(command);
    }
    
    /**
     * Start bot execution
     */
    public BotResponseDto startBot(StartBotCommand command) {
        return startBotCommandHandler.handle(command);
    }
    
    /**
     * Stop bot execution
     */
    public BotResponseDto stopBot(StopBotCommand command) {
        return stopBotCommandHandler.handle(command);
    }
    
    /**
     * Delete a bot permanently
     */
    public void deleteBot(DeleteBotCommand command) {
        deleteBotCommandHandler.handle(command);
    }
    
    // Query Operations
    
    /**
     * Get bot by ID
     */
    public BotResponseDto getBotById(String botId) {
        GetBotByIdQuery query = new GetBotByIdQuery(BotId.of(botId));
        return getBotByIdQueryHandler.handle(query);
    }
    
    /**
     * Get bots by company with optional filtering
     */
    public List<BotResponseDto> getBotsByCompany(String companyId, BotType botType, BotStatus status, int page, int size) {
        GetBotsByCompanyQuery query = new GetBotsByCompanyQuery(
            CompanyId.of(Long.valueOf(companyId)),
            botType,
            status,
            page,
            size
        );
        return getBotsByCompanyQueryHandler.handle(query);
    }
    
    /**
     * Get active bots
     */
    public List<BotResponseDto> getActiveBots(String companyId, int page, int size) {
        GetActiveBotsQuery query = new GetActiveBotsQuery(
            companyId != null ? CompanyId.of(Long.valueOf(companyId)) : null,
            page,
            size
        );
        return getActiveBotsQueryHandler.handle(query);
    }
}

