using System.ComponentModel.DataAnnotations;

namespace LittleShop.DTOs;

public class ReviewDto
{
    public Guid Id { get; set; }
    public Guid ProductId { get; set; }
    public string ProductName { get; set; } = string.Empty;
    public Guid CustomerId { get; set; }
    public string CustomerDisplayName { get; set; } = string.Empty;
    public Guid OrderId { get; set; }
    public int Rating { get; set; }
    public string? Title { get; set; }
    public string? Comment { get; set; }
    public bool IsVerifiedPurchase { get; set; }
    public bool IsApproved { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
    public DateTime? ApprovedAt { get; set; }
    public string? ApprovedByUsername { get; set; }
}

public class CreateReviewDto
{
    [Required]
    public Guid ProductId { get; set; }
    
    [Required]
    public Guid CustomerId { get; set; }
    
    [Required]
    public Guid OrderId { get; set; }
    
    [Required]
    [Range(1, 5, ErrorMessage = "Rating must be between 1 and 5 stars")]
    public int Rating { get; set; }
    
    [StringLength(100, ErrorMessage = "Title cannot exceed 100 characters")]
    public string? Title { get; set; }
    
    [StringLength(2000, ErrorMessage = "Comment cannot exceed 2000 characters")]
    public string? Comment { get; set; }
}

public class UpdateReviewDto
{
    [Range(1, 5, ErrorMessage = "Rating must be between 1 and 5 stars")]
    public int? Rating { get; set; }
    
    [StringLength(100, ErrorMessage = "Title cannot exceed 100 characters")]
    public string? Title { get; set; }
    
    [StringLength(2000, ErrorMessage = "Comment cannot exceed 2000 characters")]
    public string? Comment { get; set; }
    
    public bool? IsApproved { get; set; }
    public bool? IsActive { get; set; }
}

public class ReviewSummaryDto
{
    public Guid ProductId { get; set; }
    public string ProductName { get; set; } = string.Empty;
    public int TotalReviews { get; set; }
    public int ApprovedReviews { get; set; }
    public double AverageRating { get; set; }
    public int FiveStars { get; set; }
    public int FourStars { get; set; }
    public int ThreeStars { get; set; }
    public int TwoStars { get; set; }
    public int OneStar { get; set; }
    public DateTime? LatestReviewDate { get; set; }
}

public class CustomerReviewEligibilityDto
{
    public Guid CustomerId { get; set; }
    public Guid ProductId { get; set; }
    public bool CanReview { get; set; }
    public string? Reason { get; set; }
    public List<Guid> EligibleOrderIds { get; set; } = new();
    public bool HasExistingReview { get; set; }
    public Guid? ExistingReviewId { get; set; }
}