import type { EventTypeCustomInput } from "@prisma/client";
import { isValidPhoneNumber } from "libphonenumber-js";
import z from "zod";

type CustomInput = {
  value: string | boolean;
  label: string;
};

export function handleCustomInputs(
  eventTypeCustomInputs: EventTypeCustomInput[],
  reqCustomInputs: CustomInput[]
) {
  eventTypeCustomInputs.forEach((etcInput) => {
    if (etcInput.required) {
      const input = reqCustomInputs.find((input) => input.label === etcInput.label);
      validateInput(etcInput, input?.value);
    }
  });
}

function validateInput(etcInput: EventTypeCustomInput, value: string | boolean | undefined) {
  const errorMessage = `Missing ${etcInput.type} customInput: '${etcInput.label}'`;

  if (etcInput.type === "BOOL") {
    validateBooleanInput(value, errorMessage);
  } else if (etcInput.type === "PHONE") {
    validatePhoneInput(value, errorMessage);
  } else {
    validateStringInput(value, errorMessage);
  }
}

function validateBooleanInput(value: string | boolean | undefined, errorMessage: string) {
  z.literal(true, {
    errorMap: () => ({ message: errorMessage }),
  }).parse(value);
}

function validatePhoneInput(value: string | boolean | undefined, errorMessage: string) {
  z.string({
    errorMap: () => ({ message: errorMessage }),
  })
    .refine((val) => isValidPhoneNumber(val), {
      message: "Phone number is invalid",
    })
    .parse(value);
}

function validateStringInput(value: string | boolean | undefined, errorMessage: string) {
  z.string({
    errorMap: () => ({ message: errorMessage }),
  })
    .min(1)
    .parse(value);
}
