import Joi from 'joi';

import { generateJoiValidation } from '@/shared/validations/generateJoiValidation';
import { CustomFields } from '@/modules/customFields/customFields.model';
import { objectId } from '@/shared/validations/custom.validation';
import { CUSTOM_FORM_NAME_VALUES } from './customFields.constant';

export const createCustomFields = () => ({
  body: generateJoiValidation(CustomFields.schema).keys({
    key: Joi.string()
      .regex(/^[a-zA-Z][a-zA-Z0-9_]*$/)
      .required()
      .messages({
        'string.pattern.base':
          'Key must be alphanumeric without spaces or special characters',
      }),
    options: Joi.alternatives().conditional('type', {
      is: Joi.valid('dropdown', 'checkbox', 'radio'),
      then: Joi.array()
        .items(
          Joi.object({
            label: Joi.string().required(),
            value: Joi.string().required(),
          }),
        )
        .min(1)
        .required()
        .messages({
          'any.required':
            'Options are required for field types: dropdown, checkbox, radio',
          'array.min': 'At least one option is required',
        }),
      otherwise: Joi.forbidden(),
    }),
  }),
});

export const updateCustomFields = () => ({
  query: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: generateJoiValidation(CustomFields.schema, true).keys({
    key: Joi.string()
      .regex(/^[a-zA-Z][a-zA-Z0-9_]*$/)
      .required()
      .messages({
        'string.pattern.base':
          'Key must be alphanumeric without spaces or special characters',
      }),
    options: Joi.alternatives().conditional('type', {
      is: Joi.valid('dropdown', 'checkbox', 'radio'),
      then: Joi.array()
        .items(
          Joi.object({
            label: Joi.string().required(),
            value: Joi.string().required(),
          }),
        )
        .min(1)
        .required()
        .messages({
          'any.required':
            'Options are required for field types: dropdown, checkbox, radio',
          'array.min': 'At least one option is required',
        }),
      otherwise: Joi.forbidden(),
    }),
  }),
});

export const getCustomFields = {
  query: Joi.object().keys({
    name: Joi.string(),
    customFields: Joi.string(),
    sortBy: Joi.string(),
    search: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    companyId: Joi.string(),
    includeTimeStamps: Joi.boolean(),
    formName: Joi.string(),
  }),
};

export const getCustomFieldsById = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId),
  }),
};

export const deleteCustomFieldsById = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId),
  }),
};

export const updateCustomFieldsSequence = {
  params: Joi.object().keys({
    formName: Joi.string()
      .valid(...CUSTOM_FORM_NAME_VALUES)
      .required(),
  }),
  body: Joi.object().keys({
    sequence: Joi.array()
      .items(
        Joi.object({
          id: Joi.string().required(),
          sequence: Joi.number().required(),
        }),
      )
      .required(),
  }),
};
