import Joi from 'joi';

// Credentials validation
export const saveCredentials = {
  body: Joi.object().keys({
    apiToken: Joi.string().required().messages({
      'string.empty': 'API token is required',
      'any.required': 'API token is required',
    }),
    secretKey: Joi.string().optional().allow(''),
    xApiKey: Joi.string().optional().allow(''),
    companyId: Joi.string().optional().allow(''),
    webhookSecret: Joi.string().optional().allow(''),
    publicIvrId: Joi.string().optional().allow(''),
    isActive: Joi.boolean().default(true),
  }),
};

export const getCredentials = {
  query: Joi.object().keys({}),
};

// User sync validation
export const syncUser = {
  body: Joi.object().keys({
    userId: Joi.string().required().messages({
      'string.empty': 'User ID is required',
      'any.required': 'User ID is required',
    }),
    extension: Joi.number().integer().min(11).max(999).optional().messages({
      'number.base': 'Extension must be a number',
      'number.min': 'Extension must be at least 11',
      'number.max': 'Extension must not exceed 999',
    }),
  }),
};

export const syncAllUsers = {
  body: Joi.object().keys({}),
};

// User management validation
export const listUsers = {
  query: Joi.object().keys({
    keyword: Joi.string().optional(),
    page: Joi.number().integer().min(1).optional(),
    pageSize: Joi.number().integer().min(1).max(100).optional().messages({
      'number.max': 'Page size cannot exceed 100',
    }),
    all: Joi.boolean().optional(),
  }),
};

export const updateUser = {
  params: Joi.object().keys({
    userId: Joi.string().required(),
  }),
  body: Joi.object().keys({
    name: Joi.string().optional(),
    email: Joi.string().email().optional(),
    contact_number: Joi.string().optional(),
    country_code: Joi.string().optional(),
    extension: Joi.number().integer().min(11).max(999).optional(),
    panel_access: Joi.number().valid(1, 2).optional(),
    receive_calls: Joi.number().valid(1, 2).optional(),
    contact_type: Joi.string().valid('mobile', 'sip', 'landline').optional(),
  }),
};

export const deleteUser = {
  params: Joi.object().keys({
    userId: Joi.string().required(),
  }),
};

// Call logs validation
export const searchCallLogs = {
  query: Joi.object().keys({
    from: Joi.number().optional().messages({
      'number.base': 'From must be a UTC timestamp',
    }),
    to: Joi.number().optional().messages({
      'number.base': 'To must be a UTC timestamp',
    }),
    logFrom: Joi.number().integer().min(0).optional(),
    pageSize: Joi.number().integer().min(1).max(100).optional().messages({
      'number.max': 'Page size cannot exceed 100',
    }),
    searchKey: Joi.string().optional(),
    filters: Joi.string().optional().messages({
      'string.base': 'Filters must be a string (e.g., "5 AND 13 OR 8")',
    }),
  }),
};

export const getLogFilters = {
  query: Joi.object().keys({}),
};

// Recording validation
export const getRecording = {
  params: Joi.object().keys({
    filename: Joi.string().required().messages({
      'string.empty': 'Recording filename is required',
      'any.required': 'Recording filename is required',
    }),
  }),
};

// Lead integration validation
export const getLeadMyOperatorStatus = {
  params: Joi.object().keys({
    leadId: Joi.string().required(),
  }),
};

export const getLeadCallHistory = {
  params: Joi.object().keys({
    leadId: Joi.string().required(),
  }),
  query: Joi.object().keys({
    page: Joi.number().integer().min(1).optional(),
    pageSize: Joi.number().integer().min(1).max(100).optional(),
  }),
};

export const submitFeatureRequest = {
  body: Joi.object().keys({
    firstName: Joi.string().required().trim().messages({
      'string.empty': 'First name is required',
      'any.required': 'First name is required',
    }),
    lastName: Joi.string().required().trim().messages({
      'string.empty': 'Last name is required',
      'any.required': 'Last name is required',
    }),
    email: Joi.string().email().required().messages({
      'string.email': 'Please provide a valid email address',
      'string.empty': 'Email is required',
      'any.required': 'Email is required',
    }),
    phone: Joi.object()
      .keys({
        dialCode: Joi.number().required().messages({
          'number.base': 'Dial code must be a number',
          'any.required': 'Dial code is required',
        }),
        number: Joi.number().required().messages({
          'number.base': 'Phone number must be a number',
          'any.required': 'Phone number is required',
        }),
      })
      .required(),
    companyName: Joi.string().required().trim().messages({
      'string.empty': 'Company name is required',
      'any.required': 'Company name is required',
    }),
  }),
};

export const getRequestStatus = {
  query: Joi.object().keys({}),
};

export const initiateClickToCall = {
  body: Joi.object().keys({
    userId: Joi.string().required().trim().messages({
      'string.empty': 'Support user ID is required',
      'any.required': 'Support user ID is required',
    }),
    leadId: Joi.string().optional().trim().messages({
      'string.empty': 'Lead ID must be a valid string',
    }),
    contactId: Joi.string().optional().trim().messages({
      'string.empty': 'Contact ID must be a valid string',
    }),
  }).or('leadId', 'contactId').messages({
    'object.missing': 'Either leadId or contactId must be provided',
  }),
};

export const getCallStatus = {
  query: Joi.object().keys({
    userId: Joi.string().required().trim().messages({
      'string.empty': 'User ID is required',
      'any.required': 'User ID is required',
    }),
  }),
};
