package com.social.media.service.impl;

import com.social.media.dto.BotDto;
import com.social.media.service.BotService;
import com.social.media.domain.shared.PageResponse;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Service
public class BotServiceImpl implements BotService {
    
    @Override
    public PageResponse<BotDto> getAllBots(int page, int size) {
        List<BotDto> bots = Arrays.asList(
            new BotDto("1", "Auto Post Bot", "Automatiza postagens diárias", "AUTO_POST", true),
            new BotDto("2", "Engagement Bot", "Responde comentários automaticamente", "ENGAGEMENT", true),
            new BotDto("3", "Analytics Bot", "Coleta métricas periodicamente", "ANALYTICS", false)
        );
        
        return PageResponse.of(bots, bots.size(), page, size);
    }
    
    @Override
    public BotDto getBotById(String id) {
        BotDto bot = new BotDto(id, "Auto Post Bot", "Automatiza postagens diárias", "AUTO_POST", true);
        bot.setLastExecutionAt(LocalDateTime.now().minusHours(2));
        
        // Config
        BotDto.BotConfigDto config = new BotDto.BotConfigDto();
        config.setSchedule("0 9 * * *"); // Todos os dias às 9h
        config.setAutoRestart(true);
        config.setMaxExecutions(100);
        
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("platforms", Arrays.asList("INSTAGRAM", "FACEBOOK"));
        parameters.put("contentTypes", Arrays.asList("IMAGE", "VIDEO"));
        parameters.put("maxPostsPerDay", 3);
        config.setParameters(parameters);
        
        bot.setConfig(config);
        
        // Stats
        BotDto.ExecutionStatsDto stats = new BotDto.ExecutionStatsDto(50, 45, 5);
        stats.setLastSuccessAt(LocalDateTime.now().minusHours(2));
        stats.setLastFailureAt(LocalDateTime.now().minusDays(2));
        bot.setStats(stats);
        
        return bot;
    }
    
    @Override
    public BotDto createBot(BotDto botDto) {
        botDto.setId(UUID.randomUUID().toString());
        botDto.setCreatedAt(LocalDateTime.now());
        botDto.setActive(false); // Novo bot inicia inativo
        
        // Config padrão
        BotDto.BotConfigDto config = new BotDto.BotConfigDto();
        config.setAutoRestart(false);
        config.setMaxExecutions(0);
        botDto.setConfig(config);
        
        // Stats iniciais
        BotDto.ExecutionStatsDto stats = new BotDto.ExecutionStatsDto(0, 0, 0);
        botDto.setStats(stats);
        
        return botDto;
    }
    
    @Override
    public BotDto updateBot(String id, BotDto botDto) {
        botDto.setId(id);
        return botDto;
    }
    
    @Override
    public void deleteBot(String id) {
        // Mock implementation
    }
    
    @Override
    public PageResponse<BotDto> getBotsByUser(String userId, int page, int size) {
        List<BotDto> bots = Arrays.asList(
            new BotDto("1", "User Bot 1", "Bot pessoal do usuário", "AUTO_POST", true),
            new BotDto("2", "User Bot 2", "Segundo bot do usuário", "ENGAGEMENT", false)
        );
        
        return PageResponse.of(bots, bots.size(), page, size);
    }
    
    @Override
    public PageResponse<BotDto> getBotsByStatus(String status, int page, int size) {
        boolean isActive = "ACTIVE".equalsIgnoreCase(status);
        List<BotDto> bots = Arrays.asList(
            new BotDto("1", "Status Bot", "Bot com status " + status, "AUTO_POST", isActive)
        );
        
        return PageResponse.of(bots, bots.size(), page, size);
    }
    
    @Override
    public BotDto startBot(String id) {
        BotDto bot = getBotById(id);
        bot.setActive(true);
        bot.setLastExecutionAt(LocalDateTime.now());
        System.out.println("Bot " + id + " iniciado");
        return bot;
    }
    
    @Override
    public BotDto stopBot(String id) {
        BotDto bot = getBotById(id);
        bot.setActive(false);
        System.out.println("Bot " + id + " parado");
        return bot;
    }
    
    @Override
    public BotDto pauseBot(String id) {
        BotDto bot = getBotById(id);
        bot.setActive(false);
        System.out.println("Bot " + id + " pausado");
        return bot;
    }
    
    @Override
    public void executeBot(String id) {
        // Mock implementation - normalmente executaria o bot uma vez
        System.out.println("Bot " + id + " executado manualmente");
    }
}
