/*
 *     The Peacock Project - a HITMAN server replacement.
 *     Copyright (C) 2021-2023 The Peacock Project Team
 *
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Affero General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU Affero General Public License for more details.
 *
 *     You should have received a copy of the GNU Affero General Public License
 *     along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

import type {
    ContractSearchResult,
    GameVersion,
    RequestWithJwt,
} from "../types/types"
import type { Response } from "express"
import { getConfig, getVersionedConfig } from "../configSwizzleManager"
import { getUserData } from "../databaseHandler"
import { generateUserCentric } from "./dataGen"
import { controller, preserveContracts } from "../controller"
import { createLocationsData } from "../menus/destinations"
import { userAuths } from "../officialServerAuth"
import { log, LogLevel } from "../loggingInterop"
import {
    getRemoteService,
    contractCreationTutorialId,
    getMaxProfileLevel,
} from "../utils"

export function contractsModeHome(req: RequestWithJwt, res: Response): void {
    const contractsHomeTemplate = getConfig("ContractsTemplate", false)

    const userData = getUserData(req.jwt.unique_name, req.gameVersion)

    const contractCreationTutorial = controller.resolveContract(
        contractCreationTutorialId,
    )

    res.json({
        template: contractsHomeTemplate,
        data: {
            CreateContractTutorial: generateUserCentric(
                contractCreationTutorial!,
                req.jwt.unique_name,
                req.gameVersion,
            ),
            LocationsData: createLocationsData(req.gameVersion, true),
            FilterData: getVersionedConfig(
                "FilterData",
                req.gameVersion,
                false,
            ),
            PlayerProfileXpData: {
                XP: userData.Extensions.progression.PlayerProfileXP.Total,
                Level: userData.Extensions.progression.PlayerProfileXP
                    .ProfileLevel,
                MaxLevel: getMaxProfileLevel(req.gameVersion),
            },
        },
    })
}

export async function officialSearchContract(
    userId: string,
    gameVersion: GameVersion,
    filters: string[],
    pageNumber: number,
): Promise<ContractSearchResult> {
    const remoteService = getRemoteService(gameVersion)
    const user = userAuths.get(userId)

    if (!user) {
        log(LogLevel.WARN, `No authentication for user ${userId}!`)
        return undefined
    }

    const resp = await user._useService<{
        data: ContractSearchResult
    }>(
        pageNumber === 0
            ? `https://${remoteService}.hitman.io/profiles/page/ContractSearch?sorting=`
            : `https://${remoteService}.hitman.io/profiles/page/ContractSearchPaginate?page=${pageNumber}&sorting=`,
        false,
        filters,
    )

    preserveContracts(
        resp.data.data.Data.Contracts.map(
            (c) => c.UserCentricContract.Contract.Metadata.PublicId,
        ),
    )

    controller.storeIdToPublicId(
        resp.data.data.Data.Contracts.map((c) => c.UserCentricContract),
    )
    return resp.data.data
}