import Joi from 'joi';
import { generateJoiValidation } from '@/shared/validations/generateJoiValidation';
import { objectId } from '@/shared/validations/custom.validation';
import { UnitBookingOrHold } from './unitBookingOrHold.model';
import { IUserDoc } from '@/modules/user/user.interfaces';

const baseValidation = generateJoiValidation(UnitBookingOrHold.schema).keys({
  persons: Joi.array()
    .items(
      Joi.object({
        name: Joi.string().required(),
        aadharFront: Joi.string().uri().required(),
        aadharBack: Joi.string().uri().required(),
        panCard: Joi.string().uri().required(),
        passportPhoto: Joi.string().uri().required(),
        additionalDocs: Joi.array().items(Joi.string().uri()).optional(),
      }),
    )
    .when('action', {
      is: 'book',
      then: Joi.required(),
      otherwise: Joi.forbidden(),
    }),
  paymentPlan: Joi.string().custom(objectId).optional(),
  totalAmount: Joi.number().optional(),
  customFields: Joi.object()
    .pattern(Joi.string(), Joi.any())
    .default({}),
});

export const createUnitBookingOrHold = (user: IUserDoc) => {
  // get user check broker or not
  const isBroker = (user?.userType as string) === 'broker' || (user as any)?.companyType === 'broker';
  // console.log('isBroker', isBroker);
  // console.log('user', UserType);

  const requiredIfNotBroker = (isBroker: boolean) =>
    isBroker
      ? Joi.string().uri().optional()
      : Joi.string().uri().required();

  // override only persons
  const dynamicPersons = Joi.array()
    .items(
      Joi.object({
        name: Joi.string().required(),

        // conditional fields for broker 
        aadharFront: requiredIfNotBroker(isBroker),
        aadharBack: requiredIfNotBroker(isBroker),
        panCard: requiredIfNotBroker(isBroker),
        passportPhoto: requiredIfNotBroker(isBroker),

        additionalDocs: Joi.array().items(Joi.string().uri()).optional(),
      }),
    )
    .when('action', {
      is: 'book',
      then: Joi.required(),
      otherwise: Joi.forbidden(),
    });

  // merge with baseValidation
  const schema = baseValidation.keys({
    persons: dynamicPersons,
  });

  return {
    body: schema.xor('unit', 'property'),
  };
};

export const updateUnitBookingOrHold = () => ({
    query: Joi.object().keys({
      id: Joi.string().custom(objectId).required(),
    }),
    body: generateJoiValidation(UnitBookingOrHold.schema, true).keys({
      persons: Joi.array()
        .items(
          Joi.object({
            name: Joi.string().required(),
            aadharFront: Joi.string().uri().required(),
            aadharBack: Joi.string().uri().required(),
            panCard: Joi.string().uri().required(),
            passportPhoto: Joi.string().uri().required(),
            additionalDocs: Joi.array().items(Joi.string().uri()).optional(),
          }),
        )
        .when('action', {
          is: 'book',
          then: Joi.required(),
          otherwise: Joi.forbidden(),
        }),
      customFields: Joi.object()
        .pattern(Joi.string(), Joi.any())
        .default({}),
    }),
});

export const getUnitBookingOrHolds = {
  query: Joi.object().keys({
    lead: Joi.string().custom(objectId),
    project: Joi.string().custom(objectId),
    unit: Joi.string().custom(objectId),
    action: Joi.string().valid('book', 'hold'),
    createdBy: Joi.string().custom(objectId),
    updatedBy: Joi.string().custom(objectId),
    sortBy: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    includeTimeStamps: Joi.boolean(),
  }),
};

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

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

export const updateBookingDocument = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object({
    personIndex: Joi.number().integer().min(0).required(),
    fieldKey: Joi.string()
      .valid(
        'aadharFront',
        'aadharBack',
        'panCard',
        'passportPhoto',
        'additionalDocs',
      )
      .required(),
    url: Joi.string().uri().required(),
    additionalDocIndex: Joi.when('fieldKey', {
      is: 'additionalDocs',
      then: Joi.number().integer().min(0).required(),
      otherwise: Joi.forbidden(),
    }),
  }),
};
