"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.serializeKColor = exports.kColorEquals = exports.isSerializedKColor = exports.isKColor = exports.getRandomKColor = exports.deserializeKColor = exports.copyKColor = void 0;
const SerializationBrand_1 = require("../enums/private/SerializationBrand");
const isaacAPIClass_1 = require("./isaacAPIClass");
const random_1 = require("./random");
const rng_1 = require("./rng");
const table_1 = require("./table");
const types_1 = require("./types");
const utils_1 = require("./utils");
const OBJECT_NAME = "KColor";
const KEYS = ["Red", "Green", "Blue", "Alpha"];
/** Helper function to copy a `KColor` Isaac API class. */
function copyKColor(kColor) {
    if (!isKColor(kColor)) {
        error(`Failed to copy a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`);
    }
    return KColor(kColor.Red, kColor.Green, kColor.Blue, kColor.Alpha);
}
exports.copyKColor = copyKColor;
/**
 * Helper function to convert a `SerializedKColor` object to a normal `KColor` object. (This is used
 * by the save data manager when reading data from the "save#.dat" file.)
 */
function deserializeKColor(kColor) {
    if (!(0, types_1.isTable)(kColor)) {
        error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object was not a Lua table.`);
    }
    const [r, g, b, a] = (0, table_1.getNumbersFromTable)(kColor, OBJECT_NAME, ...KEYS);
    (0, utils_1.assertDefined)(r, `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: Red`);
    (0, utils_1.assertDefined)(g, `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: Green`);
    (0, utils_1.assertDefined)(b, `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: Blue`);
    (0, utils_1.assertDefined)(a, `Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: Alpha`);
    return KColor(r, g, b, a);
}
exports.deserializeKColor = deserializeKColor;
/**
 * Helper function to get a random `KColor` object (for use in fonts).
 *
 * If you want to generate an unseeded object, you must explicitly pass `undefined` to the
 * `seedOrRNG` parameter.
 *
 * @param seedOrRNG The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
 *                  `RNG.Next` method will be called. If `undefined` is provided, it will default to
 *                  a random seed.
 * @param alpha Optional. The alpha value to use. Default is 1.
 */
function getRandomKColor(seedOrRNG, alpha = 1) {
    const rng = (0, rng_1.isRNG)(seedOrRNG) ? seedOrRNG : (0, rng_1.newRNG)(seedOrRNG);
    const r = (0, random_1.getRandom)(rng);
    const g = (0, random_1.getRandom)(rng);
    const b = (0, random_1.getRandom)(rng);
    return KColor(r, g, b, alpha);
}
exports.getRandomKColor = getRandomKColor;
/** Helper function to check if something is an instantiated `KColor` object. */
function isKColor(object) {
    return (0, isaacAPIClass_1.isIsaacAPIClassOfType)(object, OBJECT_NAME);
}
exports.isKColor = isKColor;
/**
 * Used to determine is the given table is a serialized `KColor` object created by the `deepCopy`
 * function.
 */
function isSerializedKColor(object) {
    if (!(0, types_1.isTable)(object)) {
        return false;
    }
    return ((0, table_1.tableHasKeys)(object, ...KEYS) && object.has(SerializationBrand_1.SerializationBrand.K_COLOR));
}
exports.isSerializedKColor = isSerializedKColor;
function kColorEquals(kColor1, kColor2) {
    return (0, isaacAPIClass_1.isaacAPIClassEquals)(kColor1, kColor2, KEYS);
}
exports.kColorEquals = kColorEquals;
/**
 * Helper function to convert a `KColor` object to a `SerializedKColor` object. (This is used by the
 * save data manager when writing data from the "save#.dat" file.)
 */
function serializeKColor(kColor) {
    if (!isKColor(kColor)) {
        error(`Failed to serialize a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`);
    }
    const kColorTable = new LuaMap();
    (0, table_1.copyUserdataValuesToTable)(kColor, KEYS, kColorTable);
    kColorTable.set(SerializationBrand_1.SerializationBrand.K_COLOR, "");
    return kColorTable;
}
exports.serializeKColor = serializeKColor;
