using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Domain.Entities.Members
{
    public class MemberStats
    {
        [ForeignKey(nameof(MemberID))]
        public virtual Member Member { get; private set; } = null!;

        public byte[] RowVersion { get; set; } = Array.Empty<byte>();

        [Key]
        public int MemberID { get; set; }

        // 경험치
        public long Exp { get; set; } = 0;

        // 게시글 작성 수
        public long PostCount { get; set; } = 0;

        // 댓글 작성 수
        public long CommentCount { get; set; } = 0;

        // 받은 좋아요 수
        public long LikeReceivedCount { get; set; } = 0;

        // 준 좋아요 수
        public long LikeGivenCount { get; set; } = 0;

        // 신고 당한 횟수
        public long ReportedCount { get; set; } = 0;

        // 즐겨찾기 글 수
        public long BookmarkGivenCount { get; set; } = 0;

        // 경고 횟수
        public int WarningCount { get; set; } = 0;

        // 정지 횟수
        public int SuspensionCount { get; set; } = 0;

        // 로그인 횟수
        public long LoginCount { get; set; } = 0;

        // 출석 횟수
        public long AttendanceCount { get; set; } = 0;

        // 구독 중인 회원 수
        public long FollowingCount { get; set; } = 0;

        // 구독자 수
        public long FollowerCount { get; set; } = 0;

        // 결제 횟수
        public long PaymentCount { get; set; } = 0;

        // 누적 결제 금액
        public long TotalPaidAmount { get; set; } = 0;

        // 누적 취소/환불 금액
        public long TotalCanceledAmount { get; set; } = 0;

        private MemberStats() { }

        private MemberStats(int memberID)
        {
            if (memberID <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(memberID));
            }

            MemberID = memberID;
        }

        public static MemberStats Create(int memberID)
        {
            return new(memberID);
        }
    }
}