// @ts-check

const passthrough = require("../../passthrough")
const {discord, sync, db} = passthrough
/** @type {import("../converters/pins-to-list")} */
const pinsToList = sync.require("../converters/pins-to-list")
/** @type {import("../../matrix/api")} */
const api = sync.require("../../matrix/api")
/** @type {import("../../matrix/kstate")} */
const ks = sync.require("../../matrix/kstate")

/**
 * @template {string | null | undefined} T
 * @param {T} timestamp
 * @returns {T extends string ? number : null}
 */
function convertTimestamp(timestamp) {
	// @ts-ignore
	return typeof timestamp === "string" ? Math.floor(new Date(timestamp).getTime() / 1000) : null
}

/**
 * @param {string} channelID
 * @param {string} roomID
 * @param {number?} convertedTimestamp
 */
async function updatePins(channelID, roomID, convertedTimestamp) {
	try {
		var discordPins = await discord.snow.channel.getChannelPinnedMessages(channelID)
	} catch (e) {
		if (e.message === `{"message": "Missing Access", "code": 50001}`) {
			return // Discord sends channel pins update events even for channels that the bot can't view/get pins in, just ignore it
		}
		throw e
	}

	const kstate = await ks.roomToKState(roomID, [["m.room.pinned_events", ""]])
	const pinned = pinsToList.pinsToList(discordPins, kstate)

	const diff = ks.diffKState(kstate, {"m.room.pinned_events/": {pinned}})
	await ks.applyKStateDiffToRoom(roomID, diff)

	db.prepare("UPDATE channel_room SET last_bridged_pin_timestamp = ? WHERE channel_id = ?").run(convertedTimestamp || 0, channelID)
}

module.exports.convertTimestamp = convertTimestamp
module.exports.updatePins = updatePins
