import Joi from 'joi';
import { generateJoiValidation } from '@/shared/validations/generateJoiValidation';
import { Tasks } from '@/modules/tasks/tasks.model';
import { objectId } from '@/shared/validations/custom.validation';

const baseTaskValidation = generateJoiValidation(Tasks.schema);

const baseWithAll = baseTaskValidation.keys({
  callStatus: Joi.string()
    .valid('scheduled', 'followUp', 'reminder')
    .optional(),
  location: Joi.string().optional(),
  project: Joi.string().custom(objectId).optional(),
  property: Joi.string().custom(objectId).optional(),
  activityName: Joi.string().optional(),
  siteVisitImage: Joi.string().optional(),
  customFields: Joi.object()
    .pattern(Joi.string(), Joi.any())
    .default({}),
});

const createOrUpdateTaskSchema = Joi.alternatives().conditional(
  'activityType',
  {
    switch: [
      {
        is: 'call',
        then: baseWithAll.keys({
          callStatus: Joi.required(),
        }),
      },
      {
        is: 'meeting',
        then: baseWithAll.keys({
          location: Joi.required(),
        }),
      },
      {
        is: 'siteVisit',
        then: baseWithAll
          .keys({
            project: Joi.string().custom(objectId).optional(),
            property: Joi.string().custom(objectId).optional(),
            siteVisitImage: Joi.string().optional(),
          })
          .custom((value, helpers) => {
            // Custom validation: either project or property is required
            if (!value.project && !value.property) {
              return helpers.error('any.invalid', {
                message: 'Either project or property is required for site visit task',
              });
            }
            return value;
          }),
      },
      {
        is: 'other',
        then: baseWithAll.keys({
          activityName: Joi.required(),
        }),
      },
    ],
    otherwise: baseWithAll,
  },
);

export const createTasks = () => ({
  body: createOrUpdateTaskSchema,
});

export const updateTasks = () => ({
  params: Joi.object({
    id: Joi.string().custom(objectId).required(),
  }),
  body: createOrUpdateTaskSchema,
});

export const getTasks = {
  query: Joi.object({
    contactId: Joi.string().custom(objectId),
    leadId: Joi.string().custom(objectId),
    assignedTo: Joi.string().custom(objectId),
    activityType: Joi.string().valid('call', 'meeting', 'siteVisit', 'other'),
    activityDate: Joi.date().iso(),
    callStatus: Joi.string().valid('scheduled', 'followUp', 'reminder'),
    location: Joi.string(),
    project: Joi.string().custom(objectId),
    property: Joi.string().custom(objectId),
    activityName: Joi.string(),
    sortBy: Joi.string(),
    search: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    companyId: Joi.string(),
    includeTimeStamps: Joi.boolean(),
  }),
};

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

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

export const bulkUpdateTasks = () => ({
  body: Joi.object({
    ids: Joi.array().items(Joi.string().custom(objectId)).min(1).required(),
    updateData: createOrUpdateTaskSchema,
  }),
});

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

export const exportTasks = {
  query: Joi.object({
    status: Joi.string(),
    search: Joi.string(),
    activityType: Joi.string(),
    assignedTo: Joi.string().custom(objectId),
    activityDate: Joi.date().iso(),
    dueDateFrom: Joi.date().iso(),
    dueDateTo: Joi.date().iso(),
    taskIds: Joi.alternatives().try(
      Joi.array().items(Joi.string().custom(objectId)),
      Joi.string(),
    ),
  }),
};
