import Utilities from "./utilities";
import WebpackModules from "./webpackmodules";

/**
 * A large list of known and labelled classes in discord.
 * Click the source link down below to view more info. Otherwise, if you
 * have the library installed or have a plugin using this library,
 * do `Object.keys(ZLibrary.DiscordClassModules)` in console for a list of modules.
 * 
 * You can use this directly, however the preferred way of doing this is to use {@link module:DiscordClasses} or {@link module:DiscordSelectors}
 * 
 * @see module:DiscordClasses
 * @see module:DiscordSelectors
 * @module DiscordClassModules
 */
export default Utilities.memoizeObject({
    get ContextMenu() {return WebpackModules.getByProps("menu", "item");},
    get Scrollers() {return WebpackModules.getByProps("scrollerWrap", "scrollerThemed", "scrollerTrack");},
    get AccountDetails() {return WebpackModules.getByProps("container", "avatar", "hasBuildOverride");},
    get Typing() {return WebpackModules.getByProps("typing", "text");},
    get UserPopout() {return WebpackModules.getByProps("userPopout");},
    get PopoutRoles() {return WebpackModules.getByProps("roleCircle");},
    get UserModal() {return WebpackModules.getByProps("profileBadge");},
    get Textarea() {return WebpackModules.getByProps("channelTextArea", "textArea");},
    get Popouts() {return WebpackModules.getByProps("popouts", "popout");}, // broken, popouts element has been removed.
    get App() {return WebpackModules.getByProps("app", "mobileApp");},
    get Titles() {return WebpackModules.getByProps("defaultMarginh5");},
    get Notices() {return WebpackModules.getByProps("notice", "colorInfo");},
    get Backdrop() {return WebpackModules.getByProps("backdrop");},
    get Modals() {return WebpackModules.getModule(m => m.modal && m.inner && !m.header);},
    get AuditLog() {return WebpackModules.getByProps("userHook");},
    get ChannelList() {return Object.assign({}, WebpackModules.getByProps("containerDefault"), WebpackModules.getByProps("name", "unread"), WebpackModules.getByProps("sidebar", "hasNotice"));},
    get MemberList() {return Object.assign({}, WebpackModules.getByProps("member", "memberInner"), WebpackModules.getByProps("members", "membersWrap"));},
    get TitleWrap() {return WebpackModules.getByProps("titleWrapper");},
    get Titlebar() {return WebpackModules.getByProps("titleBar");},
    get Embeds() {return WebpackModules.getByProps("embed", "embedAuthor");},
    get Layers() {return WebpackModules.getByProps("layers", "layer");},
    get TooltipLayers() {return WebpackModules.getByProps("layerContainer", "layer");},
    get Margins() {return WebpackModules.getModule(m => !m.title && m.marginBottom40 && m.marginTop40);},
    get Dividers() {return Object.assign({}, WebpackModules.getByProps("dividerDefault"), WebpackModules.getModule(m => Object.keys(m).length == 1 && m.divider));},
    get Changelog() {return Object.assign({}, WebpackModules.getByProps("container", "added"), WebpackModules.getByProps("content", "modal", "size"));},
    get BasicInputs() {return WebpackModules.getByProps("inputDefault", "copyInput");},
    get Messages() {return WebpackModules.getByProps("message", "containerCozy");},
    get Guilds() {return WebpackModules.getByProps("guildsWrapper");},
    get EmojiPicker() {return WebpackModules.getByProps("emojiPicker", "emojiItem");},
    get Reactions() {return WebpackModules.getByProps("reaction", "reactionInner");},
    get Checkbox() {return WebpackModules.getByProps("checkbox", "checkboxInner");},
    get Tooltips() {return WebpackModules.getByProps("tooltip", "tooltipBlack");}
});