// Path: bxbot-ui-server-domain-objects/src/main/java/com/gazbert/bxbot/ui/server/domain/bot/BotConfig.java
// public class BotConfig {
// 
//     private String id;
//     private String alias;
//     private String baseUrl;
//     private String username;
//     private String password;
// 
//     // required for Jackson
//     public BotConfig() {
//     }
// 
//     public BotConfig(BotConfig other) {
//         this.id = other.id;
//         this.alias = other.alias;
//         this.baseUrl = other.baseUrl;
//         this.username = other.username;
//         this.password = other.password;
//     }
// 
//     public BotConfig(String id, String alias, String baseUrl, String username, String password) {
//         this.id = id;
//         this.alias = alias;
//         this.baseUrl = baseUrl;
//         this.username = username;
//         this.password = password;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getAlias() {
//         return alias;
//     }
// 
//     public void setAlias(String alias) {
//         this.alias = alias;
//     }
// 
//     public String getBaseUrl() {
//         return baseUrl;
//     }
// 
//     public void setBaseUrl(String baseUrl) {
//         this.baseUrl = baseUrl;
//     }
// 
//     public String getUsername() {
//         return username;
//     }
// 
//     public void setUsername(String username) {
//         this.username = username;
//     }
// 
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setPassword(String password) {
//         this.password = password;
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//                 .add("id", id)
//                 .add("alias", alias)
//                 .add("baseUrl", baseUrl)
//                 .add("username", username)
//                 .add("password", password)
//                 .toString();
//     }
// }
// 
// Path: bxbot-ui-server-domain-objects/src/main/java/com/gazbert/bxbot/ui/server/domain/bot/BotStatus.java
// public class BotStatus {
// 
//     private String id;
//     private String name;
//     private String status;
// 
//     // required for Jackson
//     public BotStatus() {
//     }
// 
//     public BotStatus(BotStatus other) {
//         this.id = other.id;
//         this.name = other.name;
//         this.status = other.status;
//     }
// 
//     public BotStatus(String id, String alias, String status) {
//         this.id = id;
//         this.name = alias;
//         this.status = status;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getStatus() {
//         return status;
//     }
// 
//     public void setStatus(String status) {
//         this.status = status;
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//                 .add("id", id)
//                 .add("name", name)
//                 .add("status", status)
//                 .toString();
//     }
// }
// 
// Path: bxbot-ui-server-repository/src/main/java/com/gazbert/bxbot/ui/server/repository/local/BotConfigRepository.java
// public interface BotConfigRepository {
// 
//     List<BotConfig> findAll();
// 
//     BotConfig findById(String id);
// 
//     BotConfig save(BotConfig config);
// 
//     BotConfig delete(String id);
// }
// 
// Path: bxbot-ui-server-repository/src/main/java/com/gazbert/bxbot/ui/server/repository/remote/runtime/BotStatusRepository.java
// public interface BotStatusRepository {
// 
//     BotStatus getBotStatus(BotConfig botConfig);
// }
// 
// Path: bxbot-ui-server-services/src/main/java/com/gazbert/bxbot/ui/server/services/runtime/BotStatusService.java
// public interface BotStatusService {
// 
//     BotStatus getBotStatus(String botId);
// 
//     List<BotStatus> getAllBotStatus();
// }


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import com.gazbert.bxbot.ui.server.domain.bot.BotConfig;
import com.gazbert.bxbot.ui.server.domain.bot.BotStatus;
import com.gazbert.bxbot.ui.server.repository.local.BotConfigRepository;
import com.gazbert.bxbot.ui.server.repository.remote.runtime.BotStatusRepository;
import com.gazbert.bxbot.ui.server.services.runtime.BotStatusService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
        LOG.info(() -> "About to fetch BotStatus for botId: " + botId);

        final BotConfig botConfig = botConfigRepository.findById(botId);
        if (botConfig == null) {
            LOG.warn("Failed to find BotConfig for botId: " + botId);
            return null;
        } else {

            BotStatus botStatus = botProcessRepository.getBotStatus(botConfig);
            if (botStatus == null) {
                botStatus = new BotStatus();
                botStatus.setId(botId);
                botStatus.setStatus("stopped"); // TODO use enum at some point...
            }
            return botStatus;
        }
    }

    @Override
    public List<BotStatus> getAllBotStatus() {

        LOG.info(() -> "About to fetch BotStatus for all bots...");

        final List<BotStatus> allBotStatus = new ArrayList<>();

        final List<BotConfig> allBotConfigs = botConfigRepository.findAll();
        for (final BotConfig botConfig : allBotConfigs) {

            BotStatus botStatus = botProcessRepository.getBotStatus(botConfig);
            if (botStatus == null) {
// Path: bxbot-ui-server-domain-objects/src/main/java/com/gazbert/bxbot/ui/server/domain/bot/BotConfig.java
// public class BotConfig {
// 
//     private String id;
//     private String alias;
//     private String baseUrl;
//     private String username;
//     private String password;
// 
//     // required for Jackson
//     public BotConfig() {
//     }
// 
//     public BotConfig(BotConfig other) {
//         this.id = other.id;
//         this.alias = other.alias;
//         this.baseUrl = other.baseUrl;
//         this.username = other.username;
//         this.password = other.password;
//     }
// 
//     public BotConfig(String id, String alias, String baseUrl, String username, String password) {
//         this.id = id;
//         this.alias = alias;
//         this.baseUrl = baseUrl;
//         this.username = username;
//         this.password = password;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getAlias() {
//         return alias;
//     }
// 
//     public void setAlias(String alias) {
//         this.alias = alias;
//     }
// 
//     public String getBaseUrl() {
//         return baseUrl;
//     }
// 
//     public void setBaseUrl(String baseUrl) {
//         this.baseUrl = baseUrl;
//     }
// 
//     public String getUsername() {
//         return username;
//     }
// 
//     public void setUsername(String username) {
//         this.username = username;
//     }
// 
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setPassword(String password) {
//         this.password = password;
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//                 .add("id", id)
//                 .add("alias", alias)
//                 .add("baseUrl", baseUrl)
//                 .add("username", username)
//                 .add("password", password)
//                 .toString();
//     }
// }
// 
// Path: bxbot-ui-server-domain-objects/src/main/java/com/gazbert/bxbot/ui/server/domain/bot/BotStatus.java
// public class BotStatus {
// 
//     private String id;
//     private String name;
//     private String status;
// 
//     // required for Jackson
//     public BotStatus() {
//     }
// 
//     public BotStatus(BotStatus other) {
//         this.id = other.id;
//         this.name = other.name;
//         this.status = other.status;
//     }
// 
//     public BotStatus(String id, String alias, String status) {
//         this.id = id;
//         this.name = alias;
//         this.status = status;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getStatus() {
//         return status;
//     }
// 
//     public void setStatus(String status) {
//         this.status = status;
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//                 .add("id", id)
//                 .add("name", name)
//                 .add("status", status)
//                 .toString();
//     }
// }
// 
// Path: bxbot-ui-server-repository/src/main/java/com/gazbert/bxbot/ui/server/repository/local/BotConfigRepository.java
// public interface BotConfigRepository {
// 
//     List<BotConfig> findAll();
// 
//     BotConfig findById(String id);
// 
//     BotConfig save(BotConfig config);
// 
//     BotConfig delete(String id);
// }
// 
// Path: bxbot-ui-server-repository/src/main/java/com/gazbert/bxbot/ui/server/repository/remote/runtime/BotStatusRepository.java
// public interface BotStatusRepository {
// 
//     BotStatus getBotStatus(BotConfig botConfig);
// }
// 
// Path: bxbot-ui-server-services/src/main/java/com/gazbert/bxbot/ui/server/services/runtime/BotStatusService.java
// public interface BotStatusService {
// 
//     BotStatus getBotStatus(String botId);
// 
//     List<BotStatus> getAllBotStatus();
// }


// Path: bxbot-ui-server-services/src/main/java/com/gazbert/bxbot/ui/server/services/runtime/impl/BotStatusServiceImpl.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import com.gazbert.bxbot.ui.server.domain.bot.BotConfig;
import com.gazbert.bxbot.ui.server.domain.bot.BotStatus;
import com.gazbert.bxbot.ui.server.repository.local.BotConfigRepository;
import com.gazbert.bxbot.ui.server.repository.remote.runtime.BotStatusRepository;
import com.gazbert.bxbot.ui.server.services.runtime.BotStatusService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

        LOG.info(() -> "About to fetch BotStatus for botId: " + botId);

        final BotConfig botConfig = botConfigRepository.findById(botId);
        if (botConfig == null) {
            LOG.warn("Failed to find BotConfig for botId: " + botId);
            return null;
        } else {

            BotStatus botStatus = botProcessRepository.getBotStatus(botConfig);
            if (botStatus == null) {
                botStatus = new BotStatus();
                botStatus.setId(botId);
                botStatus.setStatus("stopped"); // TODO use enum at some point...
            }
            return botStatus;
        }
    }

    @Override
    public List<BotStatus> getAllBotStatus() {

        LOG.info(() -> "About to fetch BotStatus for all bots...");

        final List<BotStatus> allBotStatus = new ArrayList<>();

        final List<BotConfig> allBotConfigs = botConfigRepository.findAll();
        for (final BotConfig botConfig : allBotConfigs) {

            BotStatus botStatus = botProcessRepository.getBotStatus(botConfig);
            if (botStatus == null) {
                botStatus = new BotStatus();