const { formTypes } = require("../../ModuleExportsFunctions/formTypes");

const ids = [];

module.exports = (db) => {
	return class Option {
		constructor(
			options = {
				optionId: "",
				optionName: "",
				optionDescription: "",
				optionType: formTypes,
			},
		) {
			//
			this.optionId = options.optionId;
			this.optionName = options.optionName;
			this.optionDescription = options.optionDescription;
			this.optionType = options.optionType;

			this.categoryId = "default";

			this.setNew = async ({ guild, newData }) => {
				await db.set(`${guild.id}.options.${this.optionId}`, newData);
			};

			this.getActualSet = async ({ guild }) => {
				return await db.get(`${guild.id}.options.${this.optionId}`);
			};
		}

		/**
		 *
		 * @param {string} id - The id of the option, must be unique
		 * @returns
		 */
		setId(id) {
			this.optionId = id;

			if (ids.includes(id)) throw new Error(`Option id ${id} already exists`);
			else ids.push(this.optionId);

			return this;
		}

		/**
		 *
		 * @param {string} name - The name of the option displayed in the dashboard
		 * @returns
		 */
		setName(name) {
			this.optionName = name;

			return this;
		}

		/**
		 *
		 * @param {string} description - The description of the option displayed in the dashboard
		 * @returns
		 */
		setDescription(description) {
			this.optionDescription = description;

			return this;
		}

		/**
		 *
		 * @param {object} options - Set custom options for the formType
		 * @returns
		 */
		setOptions(options) {
			this.themeOptions = options;
		}

		/**
		 *
		 * @param {formTypes} type - The type of the option
		 * @returns
		 */
		setType(type) {
			this.optionType = type;

			return this;
		}
	};
};