// Path: core/src/main/java/org/aimlang/core/channels/ChannelType.java
// public enum  ChannelType {
//     CONSOLE, VK, FACEBOOK, REST, WEBSOCKET
// }
// 
// Path: core/src/main/java/org/aimlang/core/chat/Chat.java
// public class Chat {
//     private final static String DEFAULT_NICKNAME = "Human";
//     private final BotImpl bot;
//     private final Provider provider;
//     private String nickname = DEFAULT_NICKNAME;
//     private ChatContext state;
//     private boolean started;
// 
//     public Chat(BotImpl bot, Provider provider) {
//         this.bot = bot;
//         this.provider = provider;
//     }
// 
//     public void start() {
//         provider.write("Welcome to chat with " + bot.getName() + ".\n");
//         started = true;
//         state = new ChatContext(nickname);
// 
//         String message;
//         while (started) {
//             message = read();
//             if (message.startsWith("/")) {
//                 parseCommand(message);
//             } else {
//                 String response = bot.multisentenceRespond(message, state);
//                 state.newState(message, response);
//                 write(response);
//             }
//         }
//     }
// 
//     public void stop() {
//         started = false;
//     }
// 
//     private void parseCommand(final String command) {
//         switch (command) {
//             case ChatCommand.exit:
//             case ChatCommand.quit:
//                 stop();
//                 System.exit(0);
//             case ChatCommand.stat:
//                 write(bot.getBrainStats());
//                 break;
//             case ChatCommand.reload:
//                 bot.wakeUp();
//                 break;
//             case "/connect russian":
//             case "/c russian":
//                 bot.setName("russian");
//                 bot.wakeUp();
//                 break;
//             case "/connect alice2":
//             case "/c alice2":
//                 bot.setName("alice2");
//                 bot.wakeUp();
//                 break;
//             case "/debug on":
//             case "/debug true":
//                 AimlConst.debug = true;
//                 break;
//             case "/debug off":
//             case "/debug false":
//                 AimlConst.debug = false;
//                 break;
//             default:
//                 var response = bot.multisentenceRespond(command, state);
//                 state.newState(command, response);
//                 write(response);
//                 break;
//         }
//     }
// 
//     private String read() {
//         provider.write(nickname + ": ");
//         var textLine = provider.read();
//         return textLine == null || textLine.isEmpty() ? AimlConst.null_input : textLine.trim();
//     }
// 
//     private void write(String message) {
//         provider.write(bot.getName() + ": " + message + "\n");
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/chat/ChatContext.java
// public class ChatContext {
//     private UUID chatUid;
//     private ChatHistory history;
//     private String request = "";
//     private String topic = AimlConst.default_topic;
//     private String that = AimlConst.default_that;
//     private Map<String, String> predicates = new HashMap<>();
// 
//     public ChatContext(String userName) {
//         chatUid = UUID.randomUUID();
//         history = new ChatHistory(chatUid, userName);
//     }
// 
//     public void newState(String request, String respond) {
//         this.request = request;
//         this.that = respond;
//         history.addRequest(this.request);
//         history.addRespond(this.that);
//     }
// 
//     public String topic() {
//         if (predicates.containsKey("topic")) {
//             setTopic(predicates.get("topic"));
//         }
//         return topic;
//     }
// 
//     public String that() {
//         return that;
//     }
// 
//     public String request() {
//         return request;
//     }
// 
//     public String respond() {
//         return that;
//     }
// 
//     public void setTopic(String topic) {
//         this.topic = topic;
//     }
// 
//     public void setRespond(String respond) {
//         this.that = respond;
//     }
// 
//     public void setRequest(String request) {
//         this.request = request;
//     }
// 
//     public Map<String, String> getPredicates() {
//         return predicates;
//     }
// 
// }
// 
// Path: core/src/main/java/org/aimlang/core/chat/ChatContextStorage.java
// public interface ChatContextStorage {
//     ChatContext getContext(String userId, ChannelType channelType);
// }
// 
// Path: core/src/main/java/org/aimlang/core/core/Named.java
// public interface Named {
//     String getName();
// }


import org.aimlang.core.channels.ChannelType;
import org.aimlang.core.chat.Chat;
import org.aimlang.core.chat.ChatContext;
import org.aimlang.core.chat.ChatContextStorage;
import org.aimlang.core.core.Named;
package org.aimlang.core.bot;


/**
 * Bot
 *
 * @author anton
 * @since 18/04/17
 */
public interface Bot extends Named {
    String getRespond(String phrase);

    default void startChat(String userId, ChannelType channelType) {
        setChatContext(getChatContextStorage().getContext(userId, channelType));
        buildChat().start();
    }

    Chat buildChat();

    ChatContextStorage getChatContextStorage();

// Path: core/src/main/java/org/aimlang/core/channels/ChannelType.java
// public enum  ChannelType {
//     CONSOLE, VK, FACEBOOK, REST, WEBSOCKET
// }
// 
// Path: core/src/main/java/org/aimlang/core/chat/Chat.java
// public class Chat {
//     private final static String DEFAULT_NICKNAME = "Human";
//     private final BotImpl bot;
//     private final Provider provider;
//     private String nickname = DEFAULT_NICKNAME;
//     private ChatContext state;
//     private boolean started;
// 
//     public Chat(BotImpl bot, Provider provider) {
//         this.bot = bot;
//         this.provider = provider;
//     }
// 
//     public void start() {
//         provider.write("Welcome to chat with " + bot.getName() + ".\n");
//         started = true;
//         state = new ChatContext(nickname);
// 
//         String message;
//         while (started) {
//             message = read();
//             if (message.startsWith("/")) {
//                 parseCommand(message);
//             } else {
//                 String response = bot.multisentenceRespond(message, state);
//                 state.newState(message, response);
//                 write(response);
//             }
//         }
//     }
// 
//     public void stop() {
//         started = false;
//     }
// 
//     private void parseCommand(final String command) {
//         switch (command) {
//             case ChatCommand.exit:
//             case ChatCommand.quit:
//                 stop();
//                 System.exit(0);
//             case ChatCommand.stat:
//                 write(bot.getBrainStats());
//                 break;
//             case ChatCommand.reload:
//                 bot.wakeUp();
//                 break;
//             case "/connect russian":
//             case "/c russian":
//                 bot.setName("russian");
//                 bot.wakeUp();
//                 break;
//             case "/connect alice2":
//             case "/c alice2":
//                 bot.setName("alice2");
//                 bot.wakeUp();
//                 break;
//             case "/debug on":
//             case "/debug true":
//                 AimlConst.debug = true;
//                 break;
//             case "/debug off":
//             case "/debug false":
//                 AimlConst.debug = false;
//                 break;
//             default:
//                 var response = bot.multisentenceRespond(command, state);
//                 state.newState(command, response);
//                 write(response);
//                 break;
//         }
//     }
// 
//     private String read() {
//         provider.write(nickname + ": ");
//         var textLine = provider.read();
//         return textLine == null || textLine.isEmpty() ? AimlConst.null_input : textLine.trim();
//     }
// 
//     private void write(String message) {
//         provider.write(bot.getName() + ": " + message + "\n");
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/chat/ChatContext.java
// public class ChatContext {
//     private UUID chatUid;
//     private ChatHistory history;
//     private String request = "";
//     private String topic = AimlConst.default_topic;
//     private String that = AimlConst.default_that;
//     private Map<String, String> predicates = new HashMap<>();
// 
//     public ChatContext(String userName) {
//         chatUid = UUID.randomUUID();
//         history = new ChatHistory(chatUid, userName);
//     }
// 
//     public void newState(String request, String respond) {
//         this.request = request;
//         this.that = respond;
//         history.addRequest(this.request);
//         history.addRespond(this.that);
//     }
// 
//     public String topic() {
//         if (predicates.containsKey("topic")) {
//             setTopic(predicates.get("topic"));
//         }
//         return topic;
//     }
// 
//     public String that() {
//         return that;
//     }
// 
//     public String request() {
//         return request;
//     }
// 
//     public String respond() {
//         return that;
//     }
// 
//     public void setTopic(String topic) {
//         this.topic = topic;
//     }
// 
//     public void setRespond(String respond) {
//         this.that = respond;
//     }
// 
//     public void setRequest(String request) {
//         this.request = request;
//     }
// 
//     public Map<String, String> getPredicates() {
//         return predicates;
//     }
// 
// }
// 
// Path: core/src/main/java/org/aimlang/core/chat/ChatContextStorage.java
// public interface ChatContextStorage {
//     ChatContext getContext(String userId, ChannelType channelType);
// }
// 
// Path: core/src/main/java/org/aimlang/core/core/Named.java
// public interface Named {
//     String getName();
// }


// Path: core/src/main/java/org/aimlang/core/bot/Bot.java
import org.aimlang.core.channels.ChannelType;
import org.aimlang.core.chat.Chat;
import org.aimlang.core.chat.ChatContext;
import org.aimlang.core.chat.ChatContextStorage;
import org.aimlang.core.core.Named;

package org.aimlang.core.bot;


/**
 * Bot
 *
 * @author anton
 * @since 18/04/17
 */
public interface Bot extends Named {
    String getRespond(String phrase);

    default void startChat(String userId, ChannelType channelType) {
        setChatContext(getChatContextStorage().getContext(userId, channelType));
        buildChat().start();
    }

    Chat buildChat();

    ChatContextStorage getChatContextStorage();

    void setChatContext(ChatContext context);