import { colord } from "colord";
import { ObjectColor } from "colord/types";

/**
 * Convert the value for the color input.
 *
 * @param {string|ObjectColor} value - The value to be converted.
 * @param {string} pickerComponent - The picker component name.
 * @param {string|undefined} formComponent - The form component name.
 *
 * @returns {string} The converted value.
 */
export default function convertColorForInput(
	value: string | ObjectColor,
	pickerComponent: string,
	formComponent?: string,
): string {
	let rgba;
	let hsv;
	let hsva;
	let convertedValue;

	switch (pickerComponent) {
		/**
		 * The HexColorPicker is used by these condition:
		 * 1. When formComponent is defined with HexColorPicker as the value.
		 * 2. When formComponent is not defined but the "alpha" choice is not set or set to false (the old way).
		 */
		case "HexColorPicker":
			convertedValue =
				"string" === typeof value && value.includes("#")
					? value
					: colord(value).toHex();
			break;

		case "RgbColorPicker":
			convertedValue =
				"string" === typeof value && value.includes("rgb(")
					? value
					: colord(value).toRgbString();
			break;

		case "RgbStringColorPicker":
			convertedValue =
				"string" === typeof value && value.includes("rgba")
					? value
					: colord(value).toRgbString();
			break;

		case "RgbaColorPicker":
			rgba = colord(value).toRgb();

			if (rgba.a < 1) {
				convertedValue =
					"string" === typeof value && value.includes("rgba")
						? value
						: colord(value).toRgbString();
			} else {
				convertedValue = colord(value).toRgbString();

				// Force to set the alpha value.
				if (
					convertedValue.includes("rgb") &&
					!convertedValue.includes("rgba")
				) {
					convertedValue = convertedValue.replace("rgb", "rgba");
					convertedValue = convertedValue.replace(")", ", 1)");
				}
			}

			break;

		/**
		 * The RgbaStringColorPicker is used by these condition:
		 * 1. When formComponent is defined with RgbaColorPicker as the value.
		 * 2. When formComponent is not defined but the "alpha" choice is set to true.
		 */
		case "RgbaStringColorPicker":
			rgba = colord(value).toRgb();

			// When it uses the 2nd condition above, then the expected value is "hex".
			if (rgba.a == 1 && !formComponent) {
				convertedValue =
					"string" === typeof value && value.includes("#")
						? value
						: colord(value).toHex();
			} else {
				convertedValue = colord(value).toRgbString();

				// Force to set the alpha value.
				if (
					convertedValue.includes("rgb") &&
					!convertedValue.includes("rgba")
				) {
					convertedValue = convertedValue.replace("rgb", "rgba");
					convertedValue = convertedValue.replace(")", ", 1)");
				}
			}

			break;

		case "HslColorPicker":
			convertedValue =
				"string" === typeof value && value.includes("hsl(")
					? value
					: colord(value).toHslString();
			break;

		case "HslStringColorPicker":
			convertedValue =
				"string" === typeof value && value.includes("hsl(")
					? value
					: colord(value).toHslString();
			break;

		case "HslaColorPicker":
			convertedValue = colord(value).toHslString();

			// Force to set the alpha value.
			if (convertedValue.includes("hsl") && !convertedValue.includes("hsla")) {
				convertedValue = convertedValue.replace("hsl", "hsla");
				convertedValue = convertedValue.replace(")", ", 1)");
			}

			break;

		case "HslaStringColorPicker":
			convertedValue = colord(value).toHslString();

			// Force to set the alpha value.
			if (convertedValue.includes("hsl") && !convertedValue.includes("hsla")) {
				convertedValue = convertedValue.replace("hsl", "hsla");
				convertedValue = convertedValue.replace(")", ", 1)");
			}

			break;

		/**
		 * The colord library doesn't provide .toHsvString() method yet.
		 * This manual value-building will apply to "hsv" and "hsva" stuff below.
		 */
		case "HsvColorPicker":
			hsv = colord(value).toHsv();
			convertedValue = "hsv(" + hsv.h + ", " + hsv.s + "%, " + hsv.v + "%)";
			break;

		case "HsvStringColorPicker":
			hsv = colord(value).toHsv();
			convertedValue = "hsv(" + hsv.h + ", " + hsv.s + "%, " + hsv.v + "%)";
			break;

		case "HsvaColorPicker":
			hsva = colord(value).toHsv();
			convertedValue =
				"hsva(" +
				hsva.h +
				", " +
				hsva.s +
				"%, " +
				hsva.v +
				"%, " +
				hsva.a +
				")";
			break;

		case "HsvaStringColorPicker":
			hsva = colord(value).toHsv();
			convertedValue =
				"hsva(" +
				hsva.h +
				", " +
				hsva.s +
				"%, " +
				hsva.v +
				"%, " +
				hsva.a +
				")";
			break;

		default:
			convertedValue = colord(value).toHex();
			break;
	}

	return convertedValue;
}
