using Microsoft.EntityFrameworkCore;
using Domain.Entities.Common;
using Domain.Entities.Members;
using Domain.Entities.Page;
using Domain.Entities.Page.Faq;
using Domain.Entities.Page.Banner;
using Domain.Entities.Members.Logs;
using Domain.Entities.Wallets;
using Domain.Entities.Forum.Boards;
using Domain.Entities.Forum.Posts;
using Domain.Entities.Forum.Comments;
using Domain.Entities.Director;
using Domain.Entities.EmailVerification;
using Domain.Entities.Forum.Logs;
using Domain.Entities.Page.Popup;
using Domain.Entities.Donations;
using Domain.Entities.Notes;
using Domain.Entities.Payments.Danal;

namespace Application.Abstractions.Data
{
    public interface IAppDbContext
    {
        // 관리자
        DbSet<AdminLoginLog> AdminLoginLog { get; set; }
        DbSet<AdminAccessLog> AdminAccessLog { get; set; }

        // 각종 설정 및 페이지
        DbSet<Config> Config { get; set;  }
        DbSet<Document> Document { get; set;  }
        DbSet<PopupPosition> PopupPosition { get; set; }
        DbSet<Popup> Popup { get; set;  }
        DbSet<FaqCategory> FaqCategory { get; set;  }
        DbSet<FaqItem> FaqItem { get; set;  }
        DbSet<BannerPosition> BannerPosition { get; set;  }
        DbSet<BannerItem> BannerItem { get; set;  }

        // 회원
        DbSet<Member> Member { get; set; }
        DbSet<MemberStats> MemberStats { get; set; }
        DbSet<MemberApprove> MemberApprove { get; set; }
        DbSet<MemberGrade> MemberGrade { get; set; }
        DbSet<MemberLoginLog> MemberLoginLog { get; set; }
        DbSet<MemberEmailChangeLog> MemberEmailChangeLog { get; set; }
        DbSet<MemberNameChangeLog> MemberNameChangeLog { get; set; }
        DbSet<MemberSummaryChangeLog> MemberSummaryChangeLog { get; set; }
        DbSet<MemberIntroChangeLog> MemberIntroChangeLog { get; set; }
        DbSet<MemberExpLog> MemberExpLog { get; set; }
        DbSet<Channel> Channel { get; set; }
        DbSet<RefreshToken> RefreshToken { get; set; }
        DbSet<MemberOAuthToken> MemberOAuthToken { get; set; }

        // 이메일 인증
        DbSet<EmailVerifyToken> EmailVerifyToken { get; set; }
        DbSet<EmailVerifyNumber> EmailVerifyNumber { get; set; }

        // 지갑
        DbSet<Wallet> Wallet { get; set; }
        DbSet<WalletTransaction> WalletTransaction { get; set; }

        // 게시판
        DbSet<BoardGroup> BoardGroup { get; set; }
        DbSet<Board> Board { get; set; }
        DbSet<BoardMeta> BoardMeta { get; set; }
        DbSet<BoardManager> BoardManager { get; set; }
        DbSet<BoardPrefix> BoardPrefix { get; set; }

        // 게시글
        DbSet<Post> Post { get; set; }
        DbSet<PostImage> PostImage { get; set; }
        DbSet<PostMedia> PostMedia { get; set; }
        DbSet<PostFile> PostFile { get; set; }
        DbSet<PostLink> PostLink { get; set; }
        DbSet<PostReaction> PostReaction { get; set; }
        DbSet<PostBookmark> PostBookmark { get; set; }
        DbSet<PostReport> PostReport { get; set; }
        DbSet<PostTag> PostTag { get; set; }
        DbSet<Tag> Tag { get; set; }

        // 댓글
        DbSet<Comment> Comment { get; set; }
        DbSet<CommentFile> CommentFile { get; set; }
        DbSet<CommentImage> CommentImage { get; set; }
        DbSet<CommentMedia> CommentMedia { get; set; }
        DbSet<CommentLink> CommentLink { get; set; }
        DbSet<CommentReaction> CommentReaction { get; set; }
        DbSet<CommentReport> CommentReport { get; set; }
        DbSet<CommentMention> CommentMention { get; set; }

        // 게시글/댓글 로그
        DbSet<PostUpdateLog> PostUpdateLog { get; set; }
        DbSet<PostFileDownLog> PostFileDownLog { get; set; }
        DbSet<PostLinkClickLog> PostLinkClickLog { get; set; }
        DbSet<PostViewLog> PostViewLog { get; set; }
        DbSet<CommentUpdateLog> CommentUpdateLog { get; set; }
        DbSet<CommentFileDownLog> CommentFileDownLog { get; set; }
        DbSet<CommentLinkClickLog> CommentLinkClickLog { get; set; }

        // 후원
        DbSet<Donation> Donation { get; set; }
        DbSet<DonationAlert> DonationAlert { get; set; }
        DbSet<DonationAlertAttempt> DonationAlertAttempt { get; set; }
        DbSet<DonationAlertConfig> DonationAlertConfig { get; set; }
        DbSet<DonationMeta> DonationMeta { get; set; }
        DbSet<Settlement> Settlement { get; set; }
        DbSet<SettlementAccount> SettlementAccount { get; set; }
        DbSet<WithdrawalRequest> WithdrawalRequest { get; set; }
        DbSet<DonationGoalConfig> DonationGoalConfig { get; set; }
        DbSet<DonationRankConfig> DonationRankConfig { get; set; }
        DbSet<DonationRanking> DonationRanking { get; set; }

        // 크루
        DbSet<Crew> Crew { get; set; }
        DbSet<CrewMember> CrewMember { get; set; }
        DbSet<CrewSession> CrewSession { get; set; }
        DbSet<CrewSessionConsent> CrewSessionConsent { get; set; }
        DbSet<CrewDonationSummary> CrewDonationSummary { get; set; }
        DbSet<CrewWidgetConfig> CrewWidgetConfig { get; set; }

        // 쪽지
        DbSet<Note> Note { get; set; }

        // 알림
        DbSet<Domain.Entities.Notifications.Notification> Notification { get; set; }

        // 결제
        DbSet<Domain.Entities.Payments.PaymentOrder> PaymentOrder { get; set; }
        DbSet<DanalConfirm> DanalConfirm { get; set; }
        DbSet<DanalCancel> DanalCancel { get; set; }
        DbSet<DanalLog> DanalLog { get; set; }

        Task<int> SaveChangesAsync(CancellationToken ct = default);
    }
}