using ChatApi.Models; using ChatApi.Services.Bot.Structs; using ChatApi.Services.Emails; using ChatApi.Settings; using Microsoft.Extensions.Options; using Microsoft.SemanticKernel.ChatCompletion; using System.Text; namespace ChatApi.Services.Bot { public class ChatBotRHCall { private ChatBot _chatbot; private readonly IChatCompletionService _chatCompletionService; private readonly IHttpClientFactory _httpClientFactory; private readonly IOptions _chatRHApiConfig; public UserData UserData { get; set; } Dictionary _opcoesSolicitação = new Dictionary { { "Inclusão/Exclusão Alura", "Inclusão/Exclusão Alura"}, { "Inclusão/Exclusão Auxílio Idioma", "Inclusão/Exclusão Auxílio Idioma"}, { "Inclusão/Exclusão Plano Odonto", "Inclusão/Exclusão Plano Odonto"}, //{ "Envio de Atestado", "Envio de Atestado"}, //{ "Envio de Reembolso Idioma", "Envio de Reembolso Idioma"}, //{ "Afastamento e Licenças", "Afastamento e Licenças"}, { "Dúvidas Plano de Saúde", "Dúvidas Plano de Saúde"}, { "Dúvidas Folha de Pagamento", "Dúvidas Folha de Pagamento"}, { "Ajuste Cargo/Salário", "Ajuste Cargo/Salário"}, { "Feedbacks, reclamações", "Feedbacks, reclamações"}, { "Feedz - Dúvida 1:1", "Feedz - Dúvida 1:1"}, { "Feedz - Dúvida Feedback", "Feedz - Dúvida Feedback"}, { "Feedz - Cadastro de Objetivo", "Feedz - Cadastro de Objetivo"}, { "Feedz - Erro Cadastro", "Feedz - Erro Cadastro"}, { "Feedz - Outros", "Feedz - Outros"}, { "Ciclo de Performance", "Ciclo de Performance"}, { "Declaração Bolsa Faculdade", "Declaração Bolsa Faculdade"}, { "Inclusão/Exclusão Programa de Especialização", "Inclusão/Exclusão Programa de Especialização"}, //{ "Envio de Reembolso Especialização", "Envio de Reembolso Especialização"}, { "DayOff", "DayOff"} }; private readonly IOptions _config; public ChatBotRHCall( IOptions config, IChatCompletionService chatCompletionService, IHttpClientFactory httpClientFactory, IOptions chatRHApiConfig) { _chatCompletionService = chatCompletionService; _httpClientFactory = httpClientFactory; _chatRHApiConfig = chatRHApiConfig; _config = config; } public string SetAnswer(string sessionId, string resposta, bool needsRestart = false) { if (_chatbot==null) { this.Init(sessionId); } return _chatbot.SetAnswer(resposta); } public async Task GetNextQuestion() { return await _chatbot.GetNextQuestion(); } public string GetCurrentQuestion() { return _chatbot.GetCurrentQuestion(); } public bool HasNextQuestion() { return _chatbot.HasNextQuestion(); } public async Task CallFinalAction() { return await _chatbot.CallFinalAction(); } public void Init(string sessionId) { var persist = ChatPersistence.Create(_config.Value).SetBotName("RHCall"); var actionOnEnd = new ActionCreateCall(_httpClientFactory, _chatRHApiConfig.Value); _chatbot = new ChatBot(persist, sessionId, this.UserData, _chatCompletionService, actionOnEnd); AddNumbersBeforShow(_opcoesSolicitação); _chatbot.AddQuestion(new Question( "Você quer fazer uma solicitação ao RH, certo??", resposta => !string.IsNullOrEmpty(resposta))); _chatbot.AddQuestion(new Question( "Qual seu número de celular (com WhatsApp)?", resposta => !string.IsNullOrEmpty(resposta) && resposta.Length >= 10)); _chatbot.AddQuestion(new Question( "Qual seu e-mail?", resposta => EmailValidate.IsValidEmail(resposta))); var builder = new StringBuilder(); _opcoesSolicitação.Select(s => s.Value).ToList().ForEach(s => builder.AppendLine(s)); var validNumbers = _opcoesSolicitação.Select(s => s.Value.Substring(0, s.Value.IndexOf("-")-1)).ToList(); _chatbot.AddQuestion(new Question( $"Indique o tipo de solicitação: \n {builder}", resposta => validNumbers.IndexOf(resposta) != -1, null, text => _opcoesSolicitação.FirstOrDefault(s => s.Value.Substring(0, s.Value.IndexOf("-")-1) == text).Key)); _chatbot.AddQuestion(new Question( "Texto/Descrição da solicitação (em caso de dúvidas)", resposta => !string.IsNullOrEmpty(resposta))); _chatbot.AddQuestion(new Question( "Tudo bem? Posso enviar sua solicitação? Ou prefere que eu tente fazer algum ajuste no texto da descrição? (SIM ou NÃO)", resposta => resposta.ToUpper() == "SIM" || resposta.ToUpper() == "NÃO")); } private void AddNumbersBeforShow(Dictionary dict) { int optionNumber = 1; foreach (var key in dict.Keys) { dict[key] = $"{optionNumber} - {dict[key]}"; optionNumber++; } } } }