import Joi from 'joi';
import { objectId } from '@/shared/validations/custom.validation';

const phoneSchema = Joi.object().keys({
  countryCode: Joi.number().required(),
  number: Joi.number().required(),
  isPrimary: Joi.boolean(),
});

const contactSchema = Joi.object().keys({
  firstName: Joi.string().required(),
  lastName: Joi.string().allow(''),
  phone: Joi.array().items(phoneSchema).min(1).required(),
  email: Joi.string().email().allow(''),
  isPrimary: Joi.boolean(),
  countryCode: Joi.string().allow(''),
});

export const createCPCompany = {
  body: Joi.object().keys({
    companyName: Joi.string().required(),
    website: Joi.string().allow(''),
    address: Joi.string().allow(''),
    city: Joi.string().allow(''),
    state: Joi.string().allow(''),
    country: Joi.string().allow(''),
    baseCommissionRate: Joi.number().min(0),
    notes: Joi.string().allow(''),
    primaryContacts: Joi.array().items(contactSchema),
    company: Joi.string().custom(objectId),
    createdBy: Joi.string().custom(objectId),
    updatedBy: Joi.string().custom(objectId),
  }),
};

export const updateCPCompany = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object().keys({
    companyName: Joi.string(),
    website: Joi.string().allow(''),
    address: Joi.string().allow(''),
    city: Joi.string().allow(''),
    state: Joi.string().allow(''),
    country: Joi.string().allow(''),
    baseCommissionRate: Joi.number().min(0),
    notes: Joi.string().allow(''),
    status: Joi.string().valid('Active', 'Inactive'),
    updatedBy: Joi.string().custom(objectId),
  }),
};

export const getCPCompanies = {
  query: Joi.object().keys({
    search: Joi.string().allow(''),
    status: Joi.string().valid('Active', 'Inactive'),
    companyId: Joi.string().custom(objectId),
    sortBy: Joi.string(),
    limit: Joi.number().integer(),
    page: Joi.number().integer(),
    populate: Joi.string(),
    fields: Joi.string(),
    includeTimeStamps: Joi.boolean(),
  }),
};

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

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

export const createCPContact = {
  body: Joi.object().keys({
    cpCompany: Joi.string().custom(objectId).required(),
    contacts: Joi.array().items(contactSchema).min(1).required(),
    company: Joi.string().custom(objectId),
    createdBy: Joi.string().custom(objectId),
    updatedBy: Joi.string().custom(objectId),
  }),
};

export const updateCPContact = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object().keys({
    firstName: Joi.string(),
    lastName: Joi.string().allow(''),
    phone: Joi.array().items(phoneSchema).min(1),
    email: Joi.string().email().allow(''),
    isPrimary: Joi.boolean(),
    status: Joi.string().valid('Active', 'Inactive'),
    updatedBy: Joi.string().custom(objectId),
  }),
};

export const getCPContacts = {
  query: Joi.object().keys({
    cpCompany: Joi.string().custom(objectId),
    search: Joi.string().allow(''),
    status: Joi.string().valid('Active', 'Inactive'),
    companyId: Joi.string().custom(objectId),
    sortBy: Joi.string(),
    limit: Joi.number().integer(),
    page: Joi.number().integer(),
    populate: Joi.string(),
    fields: Joi.string(),
    includeTimeStamps: Joi.boolean(),
  }),
};

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

export const recordPayment = {
  body: Joi.object().keys({
    cpCompany: Joi.string().custom(objectId).required(),
    paymentDate: Joi.date().required(),
    amountPaid: Joi.number().positive().required(),
    notes: Joi.string().allow(''),
    company: Joi.string().custom(objectId),
    createdBy: Joi.string().custom(objectId),
    updatedBy: Joi.string().custom(objectId),
  }),
};

export const getPayments = {
  query: Joi.object().keys({
    cpCompany: Joi.string().custom(objectId),
    companyId: Joi.string().custom(objectId),
    sortBy: Joi.string(),
    limit: Joi.number().integer(),
    page: Joi.number().integer(),
  }),
};

export const getCPSales = {
  query: Joi.object().keys({
    cpCompany: Joi.string().custom(objectId).required(),
    companyId: Joi.string().custom(objectId),
    search: Joi.string().allow(''),
    sortBy: Joi.string(),
    limit: Joi.number().integer(),
    page: Joi.number().integer(),
    includeTimeStamps: Joi.boolean(),
  }),
};

export const bulkUpdateStatus = {
  body: Joi.object().keys({
    ids: Joi.array().items(Joi.string().custom(objectId)).min(1).required(),
    status: Joi.string().valid('Active', 'Inactive').required(),
  }),
};

export const bulkDelete = {
  body: Joi.object().keys({
    ids: Joi.array().items(Joi.string().custom(objectId)).min(1).required(),
  }),
};
