import { type RollTable, type RollTableDetails, type RollTableDetailsAndResults, type RollTableResult } from './rolltable'; // TODO: port the rest of these to preact export function buildGeneratorPage>( { results, generatorTargetUrl, clientId, creditsUrl, editable, selected, includesResponses, builder }: { readonly results: ReadonlyMap, readonly generatorTargetUrl: string, readonly clientId: string, readonly creditsUrl: string, readonly editable: boolean, readonly selected: ReadonlySet, readonly includesResponses: boolean, readonly builder: BuilderT}): ReturnType { return builder.makeDiv( {id: "generator", classes: "page"}, builder.makeForm({method: FormMethod.Post, action: generatorTargetUrl, id: "generatorWindow", classes: ["window", "readable"]}, builder.makeHeading2({id: "generatorHead"}, builder.makeText("Your generated scenario")), builder.makeUnorderedList({id: "generatedScenario"}, ...Array.from(results.values()).map(result => buildGeneratedElement({ result, selected: (editable && includesResponses && result.table.full === 'results') ? selected.has(result.table) : null, includesResponses, builder}))), builder.makeDiv({id: "generatorControls"}, builder.makeDiv({id: "copyButtons", classes: ["buttons", "requiresJs", "jsPopupHost"]}, builder.makeButton({id: "copyMD"}, builder.makeText("Markdown")), builder.makeButton({id: "copyBB"}, builder.makeText("BBCode")), builder.makeButton({id: "copyEmojiText"}, builder.makeText("Text + Emoji")), builder.makeButton({id: "copyText"}, builder.makeText("Text Only")), ), ...(editable ? [builder.makeDiv({id: "rollButtons", classes: ["buttons"]}, builder.makeButton({type: ButtonType.Submit, id: "reroll", name: "submit", value: "reroll"}, builder.makeText("Reroll Selected")), builder.makeButton({id: "selectAll", classes: "requiresJs"}, builder.makeText("Select All")), builder.makeButton({id: "selectNone", classes: "requiresJs"}, builder.makeText("Select None")), )] : []), builder.makeDiv({id: "scenarioButtons", classes: ["buttons"]}, ...(editable ? [ builder.makeHyperlink({id: "rerollAll", url: generatorTargetUrl, destination: HyperlinkDestination.Internal, asButton: true}, builder.makeText("New Scenario")), builder.makeButton({type: ButtonType.Submit, id: "saveScenario", name: "submit", value: "saveScenario"}, builder.makeText("Get Scenario Link")) ] : [ builder.makeHyperlink({url: generatorTargetUrl, destination: HyperlinkDestination.Internal, asButton: true}, builder.makeText("Open in Generator")) ]) ), ...(clientId !== '' || includesResponses ? [builder.makeDiv({id: "generatorLinks", classes: ["buttons"]}, ...(clientId !== '' ? [builder.makeHyperlink( { url: `https://discord.com/api/oauth2/authorize?client_id=${ encodeURIComponent(clientId)}&permissions=0&scope=applications.commands`, destination: HyperlinkDestination.External, asButton: true}, builder.makeText("Add to Discord"))] : []), ...(includesResponses ? [builder.makeHyperlink( { url: `#responses`, destination: HyperlinkDestination.Internal, asButton: true}, builder.makeText("View Possible Responses"))] : []), )] : []) ) ), buildFooter({includesResponses, includesGenerator: true, creditsUrl, builder}) ) as ReturnType } export function buildResponseTypeButton>({table, builder}: {readonly table: RollTableDetails, readonly builder: BuilderT}): ReturnType { return builder.makeHyperlink({ url: `#responses-${htmlTableIdentifier(table)}`, destination: HyperlinkDestination.Internal, asButton: true, }, builder.makeText(`${table.emoji} ${table.name}`)) as ReturnType } export function buildResponse>({result, active, includesGenerator, builder}: {readonly result: RollTableResult, readonly active: boolean, readonly includesGenerator: boolean, readonly builder: BuilderT}): ReturnType { return builder.makeListItem( { id: result.full ? `response-${result.mappingId}` : undefined, classes: ["response", "jsPopupHost", ...(active ? ["active"] : []), ...(result.full ? ["attributed"] : [])], }, builder.makeButton({classes: "resultText", data: buildResultData(result)}, builder.makeText(result.text)), buildResultAttribution({ result, button: result.full && includesGenerator ? builder.makeButton({classes: ["makeResponseActive", "requiresJs"]}, builder.makeText("Set in Generated Scenario")) : undefined, builder})) as ReturnType } export function buildResponseList>({table, activeResult, includesGenerator, builder}: {readonly table: RollTableDetailsAndResults, readonly activeResult?: RollTableResult, readonly includesGenerator: boolean, readonly builder: BuilderT}): ReturnType { return builder.makeListItem( { classes: ["responseType", "window", "readable"], id: `responses-${htmlTableIdentifier(table)}` }, builder.makeHeading2( { classes: ["responseTypeHead", "tableHeader"], data: buildTableData(table) }, builder.makeSpan({classes: "tableEmoji"}, builder.makeText(table.emoji)), builder.makeText(' '), builder.makeSpan({classes: "tableTitle"}, builder.makeText(table.title)), ), builder.makeUnorderedList({}, ...Array.from(table.resultsById.values()) .map(result => buildResponse({result, active: result === activeResult, includesGenerator, builder}))) ) as ReturnType } export function buildResponsesPage>( { tables, results, creditsUrl, includesGenerator, builder }: { readonly tables: Iterable, readonly results?: ReadonlyMap, readonly creditsUrl: string, readonly includesGenerator: boolean, readonly builder: BuilderT}): ReturnType { return builder.makeDiv({id: "responses", classes: "page"}, builder.makeHeader({id: "responsesHeader", classes: "window"}, builder.makeHeading1({id: "responsesHead"}, builder.makeText("Possible Responses")), builder.makeNav({id: "responsesHeaderNav", classes: "buttons"}, ...Array.from(tables).map(table => buildResponseTypeButton({table, builder})), builder.makeHyperlink({url: `#generator`, destination: HyperlinkDestination.Internal, asButton: true, id: "returnToGenerator"}, builder.makeText("Return to Generator")) ), ), builder.makeUnorderedList({id: "responseLists"}, ...Array.from(tables).map(table => buildResponseList({table, activeResult: results?.get(table), includesGenerator, builder}))), buildFooter({builder, creditsUrl, includesResponses: true, includesGenerator}), ) as ReturnType }