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

const photoSchema = Joi.object().keys({
  photoUrl: Joi.string().required(),
  caption: Joi.string().allow('', null),
});

const timelineBody = {
  label: Joi.string().required(),
  startDate: Joi.date().required(),
  endDate: Joi.date().required(),
  status: Joi.string().valid(...Object.values(TimelineStatus)),
  photos: Joi.array().items(photoSchema),
  progress: Joi.number(),
};

export const createTimeline = {
  params: Joi.object().keys({
    projectId: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object().keys({
    ...timelineBody,
  }),
};

export const updateTimeline = {
  params: Joi.object().keys({
    projectId: Joi.string().custom(objectId).required(),
    id: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object()
    .keys({
      label: Joi.string(),
      startDate: Joi.date(),
      endDate: Joi.date(),
      progress: Joi.number(),
      status: Joi.string().valid(...Object.values(TimelineStatus)),
      photos: Joi.array().items(photoSchema),
    })
    .min(1),
};

export const getTimelines = {
  params: Joi.object().keys({
    projectId: Joi.string().custom(objectId).required(),
  }),
  query: Joi.object().keys({
    status: Joi.string(),
    search: Joi.string(),
    startDate: Joi.date(),
    endDate: Joi.date(),
    progress: Joi.number(),
    year: Joi.string(),
    sortBy: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    populate: Joi.string(),
    includeTimeStamps: Joi.boolean(),
  }),
};

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

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

// No need for validateX functions as we're using validateMiddleware in the route file
