using DamageAssesment.Api.Questions.Db;
using DamageAssesment.Api.Questions.Interfaces;
using DamageAssesment.Api.Questions.Models;
using DamageAssesment.Api.Questions.Providers;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace DamageAssesment.Api.Questions.Controllers
{
    [Route("api")]
    [ApiController]
    public class QuestionsController : ControllerBase
    {
        private readonly IQuestionsProvider questionsProvider;

        public QuestionsController(IQuestionsProvider questionsProvider)
        {

            this.questionsProvider = questionsProvider;

        }
        // get all questions
        [HttpGet("Questions")]
        public async Task<IActionResult> GetQuestionsAsync()
        {
            var result = await this.questionsProvider.GetQuestionsAsync();
            if (result.IsSuccess)
            {
                return Ok(result.Questions);
            }
            return NoContent();
        }
        //Get questions based on question id
        [HttpGet("Questions/{id}")]
        public async Task<IActionResult> GetQuestionAsync(int id)
        {
            var result = await this.questionsProvider.GetQuestionAsync(id);
            if (result.IsSuccess)
            {
                return Ok(result.Question);
            }
            return NotFound();
        }
        //get all questions based on survey id
        [HttpGet("GetSurveyQuestions/{surveyId}")]
        public async Task<IActionResult> GetSurveyQuestions(int surveyId,string? Language)
        {
            if (string.IsNullOrEmpty(Language)) Language = "en";
            var result = await this.questionsProvider.GetSurveyQuestionAsync(surveyId, Language);
            if (result.IsSuccess)
            {
                return Ok(result.SurveyQuestions);
            }
            return NotFound();
        }
        //update existing question
        [HttpPut("Questions")]
        public async Task<IActionResult> UpdateQuestion(Models.Question question)
        {
            if (question != null)
            {
                var result = await this.questionsProvider.UpdateQuestionAsync(question);
                if (result.IsSuccess)
                {
                    return Ok(result.Question);
                }
                if (result.ErrorMessage == "Not Found")
                    return NotFound(result.ErrorMessage);

                return BadRequest(result.ErrorMessage);
            }
            return CreatedAtRoute("DefaultApi", new { id = question.Id }, question);
        }
        //save new question
        [HttpPost("Questions")]
        public async Task<IActionResult> CreateQuestion(Models.Question question)
        {
            if (question != null)
            {
                var result = await this.questionsProvider.PostQuestionAsync(question);
                if (result.IsSuccess)
                {
                    return Ok(result.Question);
                }
                return BadRequest(result.ErrorMessage);
            }
            return CreatedAtRoute("DefaultApi", new { id = question.Id }, question);
        }
        // delete existing question
        [HttpDelete("Questions/{id}")]
        public async Task<IActionResult> DeleteQuestion(int id)
        {
            var result = await this.questionsProvider.DeleteQuestionAsync(id);
            if (result.IsSuccess)
            {
                return Ok(result.Question);
            }
            return NotFound();
        }


        // get all questions
        [HttpGet("QuestionCategories")]
        public async Task<IActionResult> GetQuestionCategoriesAsync()
        {
            var result = await this.questionsProvider.GetQuestionCategoriesAsync();
            if (result.IsSuccess)
            {
                return Ok(result.QuestionCategories);
            }
            return NoContent();
        }
        //Get questions based on question id
        [HttpGet("QuestionCategories/{id}")]
        public async Task<IActionResult> GetQuestionCategoryAsync(int id)
        {
            var result = await this.questionsProvider.GetQuestionCategoryAsync(id);
            if (result.IsSuccess)
            {
                return Ok(result.QuestionCategory);
            }
            return NotFound();
        }


        //update existing question
        [HttpPut("QuestionCategories")]
        public async Task<IActionResult> UpdateQuestionCategory(Models.QuestionCategory questionCategory)
        {
            if (questionCategory != null)
            {
                var result = await this.questionsProvider.UpdateQuestionCategoryAsync(questionCategory);
                if (result.IsSuccess)
                {
                    return Ok(result.QuestionCategory);
                }
                if (result.ErrorMessage == "Not Found")
                    return NotFound(result.ErrorMessage);

                return BadRequest(result.ErrorMessage);
            }
            return CreatedAtRoute("DefaultApi", new { id = questionCategory.Id }, questionCategory);
        }
        //save new question
        [HttpPost("QuestionCategories")]
        public async Task<IActionResult> CreateQuestionCategory(Models.QuestionCategory questionCategory)
        {
            if (questionCategory != null)
            {
                var result = await this.questionsProvider.PostQuestionCategoryAsync(questionCategory);
                if (result.IsSuccess)
                {
                    return Ok(result.QuestionCategory);
                }
                return BadRequest(result.ErrorMessage);
            }
            return CreatedAtRoute("DefaultApi", new { id = questionCategory.Id }, questionCategory);
        }
        // delete existing question
        [HttpDelete("QuestionCategories/{id}")]
        public async Task<IActionResult> DeleteQuestionCategory(int id)
        {
            var result = await this.questionsProvider.DeleteQuestionCategoryAsync(id);
            if (result.IsSuccess)
            {
                return Ok(result.QuestionCategory);
            }
            return NotFound();
        }
    }
}