using System;
using System.Threading.Tasks;
using API.Data;
using API.Data.Repositories;
using API.DTOs;
using API.Extensions;
using API.Services;
using API.Services.Plus;
using Microsoft.AspNetCore.Mvc;
namespace API.Controllers;
#nullable enable
/// 
/// Responsible for providing external ratings for Series
/// 
public class RatingController : BaseApiController
{
    private readonly IUnitOfWork _unitOfWork;
    private readonly IRatingService _ratingService;
    private readonly ILocalizationService _localizationService;
    public RatingController(IUnitOfWork unitOfWork, IRatingService ratingService, ILocalizationService localizationService)
    {
        _unitOfWork = unitOfWork;
        _ratingService = ratingService;
        _localizationService = localizationService;
    }
    /// 
    /// Update the users' rating of the given series
    /// 
    /// 
    /// 
    /// 
    [HttpPost("series")]
    public async Task UpdateSeriesRating(UpdateRatingDto updateRating)
    {
        var user = await _unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId(), AppUserIncludes.Ratings | AppUserIncludes.ChapterRatings);
        if (user == null) throw new UnauthorizedAccessException();
        if (await _ratingService.UpdateSeriesRating(user, updateRating))
        {
            return Ok();
        }
        return BadRequest(await _localizationService.Translate(User.GetUserId(), "generic-error"));
    }
    /// 
    /// Update the users' rating of the given chapter
    /// 
    /// chapterId must be set
    /// 
    /// 
    [HttpPost("chapter")]
    public async Task UpdateChapterRating(UpdateRatingDto updateRating)
    {
        var user = await _unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId(), AppUserIncludes.Ratings | AppUserIncludes.ChapterRatings);
        if (user == null) throw new UnauthorizedAccessException();
        if (await _ratingService.UpdateChapterRating(user, updateRating))
        {
            return Ok();
        }
        return BadRequest(await _localizationService.Translate(User.GetUserId(), "generic-error"));
    }
    /// 
    /// Overall rating from all Kavita users for a given Series
    /// 
    /// 
    /// 
    [HttpGet("overall-series")]
    public async Task> GetOverallSeriesRating(int seriesId)
    {
        return Ok(new RatingDto()
        {
            Provider = ScrobbleProvider.Kavita,
            AverageScore = await _unitOfWork.SeriesRepository.GetAverageUserRating(seriesId, User.GetUserId()),
            FavoriteCount = 0,
        });
    }
    /// 
    /// Overall rating from all Kavita users for a given Chapter
    /// 
    /// 
    /// 
    [HttpGet("overall-chapter")]
    public async Task> GetOverallChapterRating(int chapterId)
    {
        return Ok(new RatingDto()
        {
            Provider = ScrobbleProvider.Kavita,
            AverageScore = await _unitOfWork.ChapterRepository.GetAverageUserRating(chapterId, User.GetUserId()),
            FavoriteCount = 0,
        });
    }
}