using AutoMapper; using DamageAssesment.Api.Questions.Db; using DamageAssesment.Api.Questions.Interfaces; using DamageAssesment.Api.Questions.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace DamageAssesment.Api.Questions.Providers { public class QuestionsProvider : IQuestionsProvider, IQuestionTypesProvider { private QuestionDbContext questionDbContext; private ILogger logger; private IMapper mapper; public QuestionsProvider(QuestionDbContext questionDbContext, ILogger logger, IMapper mapper) { this.questionDbContext = questionDbContext; this.logger = logger; this.mapper = mapper; SeedData(); } private void SeedData() { if (!questionDbContext.QuestionsTranslations.Any()) { questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() {Id=1, QuestionId = 1, QuestionText = "Can You Open ?",Language="en" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 2, QuestionId = 1, QuestionText = "Peux-tu ouvrir ?", Language = "fr" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 3, QuestionId = 2, QuestionText = "Are the grounds flodded ?", Language = "en" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 4, QuestionId = 2, QuestionText = "Les terrains sont-ils inondés ?", Language = "fr" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 5, QuestionId = 3, QuestionText = "Is the access blocked by flooding ?", Language = "en" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 6, QuestionId = 3, QuestionText = "L'accès est-il bloqué par les inondations ?", Language = "fr" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 7, QuestionId = 1, QuestionText = "Puedes abrir ?", Language = "sp" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 8, QuestionId = 2, QuestionText = "¿Están inundados los terrenos?", Language = "sp" }); questionDbContext.QuestionsTranslations.Add(new Db.QuestionsTranslation() { Id = 9, QuestionId = 3, QuestionText = "¿El acceso está bloqueado por inundaciones?", Language = "sp" }); questionDbContext.SaveChanges(); } if (!questionDbContext.Questions.Any()) { questionDbContext.Questions.Add(new Db.Question() { Id = 1, QuestionTypeId = 2, SurveyId = 1, QuestionNumber = 1, IsRequired = true, Comment = false, Key = true, QuestionGroup = "group1",CategoryId=1 }); questionDbContext.Questions.Add(new Db.Question() { Id = 2, QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 2, IsRequired = false, Comment = true, Key = false, QuestionGroup = "group1", CategoryId = 1 }); questionDbContext.Questions.Add(new Db.Question() { Id = 3, QuestionTypeId = 1, SurveyId = 1, QuestionNumber = 3, IsRequired = true, Comment = false, Key = true, QuestionGroup = "group1", CategoryId = 2 }); questionDbContext.SaveChanges(); } if (!questionDbContext.QuestionTypes.Any()) { questionDbContext.QuestionTypes.Add(new Db.QuestionType() { Id = 1, TypeText = "Text 1" }); questionDbContext.QuestionTypes.Add(new Db.QuestionType() { Id = 2, TypeText = "Text 2" }); questionDbContext.QuestionTypes.Add(new Db.QuestionType() { Id = 3, TypeText = "Text 3" }); questionDbContext.QuestionTypes.Add(new Db.QuestionType() { Id = 4, TypeText = "Text 4" }); questionDbContext.QuestionTypes.Add(new Db.QuestionType() { Id = 5, TypeText = "Text 5" }); questionDbContext.SaveChanges(); } if (!questionDbContext.QuestionCategories.Any()) { questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { Id = 1, CategoryName = "Category 1", CategoryImage="img1" }); questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { Id = 2, CategoryName = "Category 2", CategoryImage = "img1" }); questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { Id = 3, CategoryName = "Category 3", CategoryImage = "img1" }); questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { Id = 4, CategoryName = "Category 4", CategoryImage = "img1" }); questionDbContext.QuestionCategories.Add(new Db.QuestionCategory() { Id = 5, CategoryName = "Category 5", CategoryImage = "img1" }); questionDbContext.SaveChanges(); } } public async Task<(bool IsSuccess, IEnumerable Questions, string ErrorMessage)> GetQuestionsAsync() { try { logger?.LogInformation("Query Question"); var questions = await questionDbContext.Questions.Include("QuestionType").AsNoTracking().ToListAsync(); if (questions != null) { //logger?.LogInformation($"{question} customer(s) found"); var result = mapper.Map, IEnumerable>(questions); foreach (var question in result) { question.Questions=mapper.Map,List>( questionDbContext.QuestionsTranslations.Where(a=>a.QuestionId==question.Id).ToList()); } return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.Question Question, string ErrorMessage)> GetQuestionAsync(int Id) { try { logger?.LogInformation("Query Question"); var question = await questionDbContext.Questions.Include("QuestionType").AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id); if (question != null) { logger?.LogInformation($"{question} customer(s) found"); var result = mapper.Map(question); result.Questions = mapper.Map, List>( questionDbContext.QuestionsTranslations.Where(a => a.QuestionId == result.Id).ToList()); return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public List GetSurveyQuestion(List questions,string Language) { foreach (var item in questions) { item.Questions= mapper.Map, List>( questionDbContext.QuestionsTranslations.Where(a => a.QuestionId == item.Id && a.Language== Language).ToList()); } return questions; } public async Task<(bool IsSuccess, List SurveyQuestions, string ErrorMessage)> GetSurveyQuestionAsync(int SurveyId, string Language) { try { logger?.LogInformation("Query Question"); var questions = await questionDbContext.Questions.Include("QuestionType").Where(a=>a.SurveyId==SurveyId).AsNoTracking().ToListAsync(); if (questions != null) { List surveyQuestionsList = new List(); List CategoryIds=questions.Select(a=>a.CategoryId).Distinct().ToList(); var questioncategories = await questionDbContext.QuestionCategories.Where(a =>CategoryIds.Contains(a.Id)).ToListAsync(); //logger?.LogInformation($"{question} customer(s) found"); foreach (var item in questioncategories) { surveyQuestionsList.Add(new SurveyQuestions() { CategoryId = item.Id, CategoryImage = item.CategoryImage, CategoryName = item.CategoryName, Questions = GetSurveyQuestion(mapper.Map, List>(questions.Where(a => a.CategoryId == item.Id).ToList()), Language) }); } //var result = mapper.Map, IEnumerable>(questions); return (true, surveyQuestionsList, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.Question Question, string ErrorMessage)> PostQuestionAsync(Models.Question Question) { try { logger?.LogInformation("Query Question"); var dbquestion = mapper.Map(Question); var dbquestiontranslation = mapper.Map, List>(Question.Questions); dbquestion.QuestionTypeId=questionDbContext.QuestionTypes.Where(a=>a.TypeText==Question.TypeText).Select(a=>a.Id).FirstOrDefault(); questionDbContext.Questions.Add(dbquestion); dbquestiontranslation.ForEach(i => i.QuestionId = dbquestion.Id); questionDbContext.QuestionsTranslations.AddRange(dbquestiontranslation); questionDbContext.SaveChanges(); Question.Id = dbquestion.Id; return (true, Question, null); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.Question Question, string ErrorMessage)> UpdateQuestionAsync(Models.Question Question) { try { var dbquestion = mapper.Map(Question); var dbquestiontranslation = mapper.Map, List>(Question.Questions); dbquestion.QuestionTypeId = questionDbContext.QuestionTypes.Where(a => a.TypeText == Question.TypeText).Select(a => a.Id).FirstOrDefault(); questionDbContext.Entry(dbquestion).State = EntityState.Modified; var oldquestions = questionDbContext.QuestionsTranslations.Where(a => a.QuestionId == dbquestion.Id).ToList(); if(oldquestions!=null) questionDbContext.QuestionsTranslations.RemoveRange(oldquestions); dbquestiontranslation.ForEach(i => i.QuestionId = dbquestion.Id); questionDbContext.QuestionsTranslations.AddRange(dbquestiontranslation); questionDbContext.SaveChanges(); return (true, Question, null); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.Question Question, string ErrorMessage)> DeleteQuestionAsync(int Id) { try { var question = await questionDbContext.Questions.Where(x => x.Id == Id).FirstOrDefaultAsync(); if (question != null) { questionDbContext.Questions.Remove(question); questionDbContext.SaveChanges(); return (true, mapper.Map(question), $"QuestionID {Id} deleted Successfuly"); } else { logger?.LogInformation($"QuestionID: {Id} Not found"); return (false, null, "Not Found"); } } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } //Question Category Logic public async Task<(bool IsSuccess, IEnumerable QuestionCategories, string ErrorMessage)> GetQuestionCategoriesAsync() { try { logger?.LogInformation("Query Question"); var questionCategories = await questionDbContext.QuestionCategories.AsNoTracking().ToListAsync(); if (questionCategories != null) { //logger?.LogInformation($"{question} customer(s) found"); var result = mapper.Map, IEnumerable>(questionCategories); return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.QuestionCategory QuestionCategory, string ErrorMessage)> GetQuestionCategoryAsync(int Id) { try { logger?.LogInformation("Query Question"); var questioncategory = await questionDbContext.QuestionCategories.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id); if (questioncategory != null) { logger?.LogInformation($"{questioncategory} customer(s) found"); var result = mapper.Map(questioncategory); return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.QuestionCategory QuestionCategory, string ErrorMessage)> PostQuestionCategoryAsync(Models.QuestionCategory QuestionCategory) { try { logger?.LogInformation("Query Question"); var dbQuestionCategory = mapper.Map(QuestionCategory); // Question.QuestionType = GetQuestionType(Question.QuestionTypeId); questionDbContext.QuestionCategories.Add(dbQuestionCategory); questionDbContext.SaveChanges(); QuestionCategory.Id=dbQuestionCategory.Id; return (true, QuestionCategory, null); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.QuestionCategory QuestionCategory, string ErrorMessage)> UpdateQuestionCategoryAsync(Models.QuestionCategory QuestionCategory) { try { var dbQuestionCategory = mapper.Map(QuestionCategory); questionDbContext.Entry(dbQuestionCategory).State = EntityState.Modified; questionDbContext.SaveChanges(); return (true, QuestionCategory, null); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.QuestionCategory QuestionCategory, string ErrorMessage)> DeleteQuestionCategoryAsync(int Id) { try { var questioncategory = await questionDbContext.QuestionCategories.Where(x => x.Id == Id).FirstOrDefaultAsync(); if (questioncategory != null) { var question = await questionDbContext.Questions.Where(x => x.Id == Id).ToListAsync(); questionDbContext.Questions.RemoveRange(question); questionDbContext.QuestionCategories.Remove(questioncategory); questionDbContext.SaveChanges(); return (true, mapper.Map(questioncategory), $"QuestionID {Id} deleted Successfuly"); } else { logger?.LogInformation($"QuestionID: {Id} Not found"); return (false, null, "Not Found"); } } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } private bool QuestionExists(int id) { return questionDbContext.Questions.AsNoTracking().Count(e => e.Id == id) > 0; } private QuestionType GetQuestionType(int Id) { return questionDbContext.QuestionTypes.Where(a => a.Id == Id).FirstOrDefault(); } public async Task<(bool IsSuccess, QuestionType QuestionType, string ErrorMessage)> GetQuestionTypeAsync(int Id) { try { logger?.LogInformation("Query Question"); var questiontype = await questionDbContext.QuestionTypes.FirstOrDefaultAsync(q => q.Id == Id); if (questiontype != null) { logger?.LogInformation($"{questiontype} customer(s) found"); return (true, questiontype, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, IEnumerable QuestionTypes, string ErrorMessage)> GetQuestionTypesAsync() { try { logger?.LogInformation("Query Question"); var questionTypes = await questionDbContext.QuestionTypes.ToListAsync(); if (questionTypes != null) { //logger?.LogInformation($"{question} customer(s) found"); return (true, questionTypes, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } } }