import { Joi } from './joi';

export const signupSchema = {
  body: Joi.object({
    email: Joi.string().email().required().trim(),
    password: Joi.string()
      .required()
      .min(8)
      .alphanum()
      .trim()
      .message('"Password" length should be minimum of 8 characters'),
    confirmPassword: Joi.required().valid(Joi.ref('password')),
    companyName: Joi.string().required().case('upper').trim(),
    rcNumber: Joi.string().required().trim(),
    address: Joi.string().required().trim(),
    phoneNumber: Joi.string()
      .required()
      .length(14)
      .trim()
      .message('number should be in the "+2348012345678" format'),
  }),
};

export const signinSchema = {
  body: Joi.object({
    email: Joi.string().email().required(),
    password: Joi.string().required(),
  }),
};

export const verifyMailSchema = {
  query: Joi.object({
    token: Joi.string().required(),
  }),
};

export const verificationLinkSchema = {
  body: Joi.object({
    email: Joi.string().email().required(),
  }),
};

export const forgotPasswordSchema = {
  body: Joi.object({
    email: Joi.string().email().required(),
  }),
};

export const resetPasswordSchema = {
  body: Joi.object({
    newPassword: Joi.string()
      .required()
      .min(8)
      .alphanum()
      .trim()
      .message('"New password" length should be minimum of 8 characters'),
    confirmPassword: Joi.required().valid(Joi.ref('newPassword')),
  }),
  query: Joi.object({
    token: Joi.string().required(),
  }),
};

export const changePasswordSchema = {
  body: Joi.object({
    oldPassword: Joi.string()
      .required()
      .min(8)
      .alphanum()
      .trim()
      .message('"Current password" length should be minimum of 8 characters'),
    newPassword: Joi.string()
      .required()
      .min(8)
      .alphanum()
      .trim()
      .message('"Current password" length should be minimum of 8 characters'),
    confirmPassword: Joi.required().valid(Joi.ref('newPassword')),
  }),
};

export const createUserSchema = {
  body: Joi.object({
    firstName: Joi.string().required().trim(),
    lastName: Joi.string().required().trim(),
    userType: Joi.string().required().trim().valid('staff', 'rider'),
    email: Joi.string().email().required().trim(),
    phoneNumber: Joi.string()
      .required()
      .length(14)
      .trim()
      .message('number should be in the "+2348012345678" format'),
    password: Joi.string()
      .required()
      .min(8)
      .alphanum()
      .trim()
      .message('"Password" length should be minimum of 8 characters'),
    confirmPassword: Joi.required().valid(Joi.ref('password')),
    role_id: Joi.when('userType', {
      is: 'staff',
      then: Joi.objectId().required(),
      otherwise: Joi.forbidden(),
    }),
    address: Joi.when('userType', {
      is: 'rider',
      then: Joi.string().trim().required(),
      otherwise: Joi.forbidden(),
    }),
  }),
};

export const getUserSchema = {
  params: Joi.object({
    userType: Joi.string().required().trim().valid('staff', 'rider', 'all'),
  }),
  query: Joi.object({
    userID: Joi.objectId(),
    limit: Joi.number(),
    page: Joi.number(),
    sort: Joi.object(),
    isActive: Joi.string().allow(''),
    userType: Joi.string().allow(''),
    keyword: Joi.string().allow(''),
  }),
};

export const editUserSchema = {
  params: Joi.object({
    userType: Joi.string().required().trim().valid('staff', 'rider'),
    userID: Joi.objectId().required(),
  }),
  body: Joi.object({
    firstName: Joi.string().trim(),
    lastName: Joi.string().trim(),
    email: Joi.string().email().trim(),
    phoneNumber: Joi.string()
      .length(14)
      .trim()
      .message('number should be in the "+2348012345678" format'),
    address: Joi.string().trim(),
    role_id: Joi.objectId(),
  }),
};

export const saveDeviceTokenSchema = {
  body: Joi.object({
    deviceToken: Joi.object(),
  }),
};

export const getDeviceTokensSchema = {
  params: Joi.object({
    userID: Joi.string().trim(),
  }),
};

export const createRoleSchema = {
  body: Joi.object({
    role: Joi.string().required().trim(),
    permissions: Joi.array().required().items(Joi.string().trim()),
  }),
};

export const assignRoleSchema = {
  body: Joi.object({
    roleID: Joi.objectId().required(),
    userID: Joi.array().required().items(Joi.objectId()),
  }),
};

export const editRoleSchema = {
  body: Joi.object({
    role: Joi.string().required().trim(),
    permissions: Joi.array().required().items(Joi.string().trim()),
  }),
  params: Joi.object({
    roleID: Joi.objectId().required(),
  }),
};

export const getRoleSchema = {
  query: Joi.object({
    roleID: Joi.objectId(),
  }),
};

export const activateSchema = {
  query: Joi.object({
    action: Joi.string().required().trim().valid('activate', 'deactivate'),
  }),
  params: Joi.object({
    userType: Joi.string().required().trim().valid('staff', 'rider'),
    userID: Joi.objectId().required(),
  }),
};

export const batchActivateSchema = {
  body: Joi.object({
    userID: Joi.array().required().items(Joi.objectId()),
  }),
  params: Joi.object({
    action: Joi.string().required().trim().valid('activate', 'deactivate'),
  }),
};
