import Joi from 'joi';

import { generateJoiValidation } from '@/shared/validations/generateJoiValidation';
import { Customer } from '@/modules/customer/customer.model';
import { objectId } from '@/shared/validations/custom.validation';

export const createCustomer = () => ({
  body: generateJoiValidation(Customer.schema).keys({
    totalAmount: Joi.number().required(),
    bookingAmount: Joi.number().required(),
    rentAmount: Joi.number().optional(),
    rentAmountPaid: Joi.number().optional(),
    depositAmount: Joi.number().optional(),
    depositAmountPaid: Joi.number().optional(),
    bankAccountId: Joi.string().custom(objectId).optional(),
    sales: Joi.array()
      .items(
        Joi.object({
          kind: Joi.string().valid('Project', 'Property'),

          project: Joi.string().custom(objectId),
          property: Joi.string().custom(objectId),

          leadId: Joi.string().custom(objectId).optional(),
          leadSource: Joi.object({
            name: Joi.string().optional(),
            id: Joi.string().custom(objectId).optional(),
          }).optional(),
          date: Joi.date().optional(),
          totalAmount: Joi.number().optional(),
          bookingAmount: Joi.number().optional(),
          unitBookingOrHold: Joi.string().custom(objectId).optional(),

          soldBy: Joi.string().optional(),
          salesAt: Joi.date().optional(),
          notes: Joi.string().optional(),
        })
          .oxor('project', 'property')
          .when(Joi.object({ project: Joi.exist() }).unknown(), {
            then: Joi.object({ kind: Joi.valid('Project').default('Project') }),
          })
          .when(Joi.object({ property: Joi.exist() }).unknown(), {
            then: Joi.object({ kind: Joi.valid('Property').default('Property') }),
          }),
      )
      .optional(),
  }),
});

export const updateCustomer = () => ({
  query: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: generateJoiValidation(Customer.schema, true),
});

export const getCustomers = {
  query: Joi.object().keys({
    name: Joi.string(),
    role: Joi.string(),
    sortBy: Joi.string(),
    projectBy: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    populate: Joi.string(),
    status: Joi.string(),
    customerType: Joi.string(),
    search: Joi.string(),
    state: Joi.string(),
    company: Joi.string(),
    createdBy: Joi.string(),
    leadId: Joi.string().custom(objectId),
    project: Joi.string(),
    salesBy: Joi.string(),
    salesDate: Joi.string(),
    excludeCancelled: Joi.string().valid('true', 'false'),
  }),
};

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

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


export const updateCustomerDocumentStatus = {
  params: Joi.object().keys({
   id: Joi.string().custom(objectId),
  }),
  query: Joi.object().keys({
    documentId: Joi.string().custom(objectId),
    status: Joi.string(),
    url: Joi.string(),
  }),
};

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