import Joi from 'joi';

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

export const projectBody = Joi.object({
  projectName: Joi.string().trim().required(),
  propertyType: Joi.string().custom(objectId).required(),
  subCategory: Joi.string().custom(objectId).required(),
  status: Joi.string()
    .valid(
      'under_construction',
      'possession_soon',
      'ready_possession',
      'launch',
    )
    .default('under_construction'),
  locality: Joi.string().custom(objectId).required(),
  city: Joi.string().custom(objectId).required(),
  state: Joi.string().custom(objectId).required(),
  pincode: Joi.number().integer().min(1),
  pricePerSqYard: Joi.number().positive(),
  reraId: Joi.string().trim().allow('').allow(null),
  possessionDate: Joi.date().iso(),
  landmark: Joi.string().trim().allow('').allow(null),
  description: Joi.string().trim().allow('').allow(null),
  amenities: Joi.array().items(Joi.string().custom(objectId)),
  team: Joi.string().allow(null, '').custom(objectId).optional(),
  creationMethod: Joi.string().valid('search', 'form').default('search'),
  mediaUrls: Joi.array().items(Joi.string()),
  hasBlockLayout: Joi.boolean().default(false),
  visibleToUsers: Joi.array().items(Joi.string().custom(objectId)).default([]),
  visibleToTeams: Joi.array().items(Joi.string().custom(objectId)).default([]),
  isPublicVisibility: Joi.boolean().default(true),
});
export const createProject = () => ({
  body: projectBody,
});

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

export const getProjects = {
  query: Joi.object().keys({
    projectName: Joi.string(),
    propertyType: Joi.string().custom(objectId),
    sortBy: Joi.string(),
    projectBy: Joi.string(),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    search: Joi.string(),
    fields: Joi.string(),
    includeTimeStamps: Joi.boolean(),
  }),
};

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

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

export const searchProjects = {
  query: Joi.object().keys({
    q: Joi.string().required(),
    limit: Joi.number().integer().min(1).max(50).default(10),
  }),
};

export const createFromSearch = {
  body: Joi.object().keys({
    searchQuery: Joi.string().required(),
    forceCreate: Joi.boolean().default(false),
    area: Joi.string().custom(objectId).required(),
    city: Joi.string().custom(objectId).required(),
    state: Joi.string().custom(objectId).required(),
  }),
};

export const updateProjectAmenities = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object().keys({
    amenities: Joi.array().items(Joi.string().custom(objectId)).required(),
  }),
};

export const updateProjectVisibility = {
  params: Joi.object().keys({
    id: Joi.string().custom(objectId).required(),
  }),
  body: Joi.object().keys({
    visibleToUsers: Joi.array().items(Joi.string().custom(objectId)).default([]),
    visibleToTeams: Joi.array().items(Joi.string().custom(objectId)).default([]),
  }),
};

export const updateProjectsPublicVisibility = {
  body: Joi.object().keys({
    projectIds: Joi.array().items(Joi.string().custom(objectId)).required(),
    isPublicVisibility: Joi.boolean().required(),
  }),
};
