namespace SharedKernel.Storage
{
    public enum UploadTarget
    {
        Editor = 1,
        Upload
    }

    public enum UploadFolder
    {
        Basic = 1,          // 기본 설정
        EmailTemplate,      // 알림 발송 양식 - 이메일
        Document,           // 문서
        Faq,                // 자주 묻는 질문
        Popup,              // 팝업
        Banner,             // 배너
        MemberGrade,        // 회원등급
        MemberThumb,        // 회원 사진
        MemberIcon,         // 회원 아이콘
        Board,              // 게시판
        Post,               // 게시글
        Comment,            // 댓글
        Crypto,             // 코인/토큰
        DonationAlert       // 후원 알림 미디어
    }

    // 추가 경로 값
    public enum UploadAddition
    {
        // 기본 설정
        BlockAlertContent = 1,
        MaintenanceContent,

        // 게시판
        ListHeaderContent,                  // 게시판 목록 - 상단 내용
        ListFooterContent,                  // 게시판 목록 - 하단 내용
        PostWriteEmailNotifyContent ,       // 게시판 알림 양식 - 게시글 작성 시 내용
        CommentWriteEmailNotifyContent,     // 게시판 알림 양식 - 댓글 작성 시 내용
        ReplyWriteEmailNotifyContent,       // 게시판 알림 양식 - 답글 작성 시 내용
        WriteHeaderContent,                 // 게시판 작성 - 상단 내용
        WriteFooterContent,                 // 게시판 작성 - 하단 내용
        WriteDefaultContent,                // 게시판 작성 - 작성란 기본 내용

        // 알림 발송 양식- 이메일
        RegisterEmailFormContent,
        RegistrationEmailFormContent,
        ResetPasswordEmailFormContent,
        ChangedPasswordEmailFormContent,
        WithdrawEmailFormContent,
        EmailVerifyFormContent,
        ChangedEmailFormContent
    }

    public readonly record struct FileStoragePath(UploadTarget Target, UploadFolder Folder, int? ID = null, UploadAddition? Addition = null)
    {
        public string ToRelativePath()
        {
            string t = Target switch
            {
                UploadTarget.Editor => "editors",
                UploadTarget.Upload => "uploads",
                _ => throw new ArgumentNullException(nameof(Target))
            };

            string f = Folder switch
            {
                UploadFolder.Basic => "basic",
                UploadFolder.EmailTemplate => "template/email",
                UploadFolder.Document => "document",
                UploadFolder.Faq => "faq",
                UploadFolder.Popup => "popup",
                UploadFolder.Banner => "banner",
                UploadFolder.MemberGrade => "member/grade",
                UploadFolder.MemberThumb => "member/thumb",
                UploadFolder.MemberIcon => "member/icon",
                UploadFolder.Board => "board",
                UploadFolder.Post => "post",
                UploadFolder.Comment => "comment",
                UploadFolder.Crypto => "crypto",
                UploadFolder.DonationAlert => "donation/alert",
                _ => string.Empty
            };

            var a = Addition.HasValue ? ((int)Addition.Value).ToString() : string.Empty;

            return string.Join('/', new[] { t, f, ID.ToString(), a }.Where(x => !string.IsNullOrWhiteSpace(x)));
        }
    }
}