import Joi from 'joi';
import { objectId } from '@/shared/validations/custom.validation'; // Assuming this path is correct for your project

const basePropertyValidation = {
  // Basic Details - Required fields from basicDetailsSchema
  title: Joi.string().min(10).required(),
  description: Joi.string().min(20).required(),
  project: Joi.string().min(1).required(),
  propertyType: Joi.string().min(1).required(),
  subcategory: Joi.string().min(1).required(),
  listingType: Joi.string()
    .valid('sell', 'rent', 'lease', 'preLease')
    .default('sell')
    .required(),
  reraId: Joi.string().min(1).required(),
  configuration: Joi.string().min(1).required(),

  // Location fields - Required fields from locationOwnerSchema
  address: Joi.string().min(10),
  locality: Joi.string().min(2).required(),
  state: Joi.string().min(2).required(),
  city: Joi.string().min(2).required(),
  pincode: Joi.number().integer().min(100000).max(999999),
  landZoneType: Joi.string().allow('').allow(null),

  // Property Details (Generic and Common Property Details)
  carpetArea: Joi.number().min(1).required(),
  builtUpArea: Joi.number().min(1).allow(null),
  superBuiltUpArea: Joi.number().min(1).allow(null),
  length: Joi.number().min(1).allow(null),
  width: Joi.number().min(1).allow(null),
  bedrooms: Joi.string().allow('').allow(null),
  bathrooms: Joi.string().allow('').allow(null),
  balconies: Joi.string().allow('').allow(null),
  totalFloors: Joi.number().min(1).allow(null),
  floorNumber: Joi.number().min(0).allow(null),
  carParking: Joi.string().allow('').allow(null),
  furnishingStatus: Joi.string().allow('').allow(null),
  ageOfProperty: Joi.string().allow('').allow(null),
  facing: Joi.string().allow('').allow(null),
  possessionStatus: Joi.string().allow('').allow(null),

  ownerName: Joi.string().min(2).required(),
  ownerContact: Joi.number()
    .integer()
    .min(1_000_000_000)
    .max(9_999_999_999)
    .required(),
  ownerEmail: Joi.string().email().allow('').allow(null),

  unitOfMeasurement: Joi.string().allow('').allow(null),
  flatNumber: Joi.string().allow('').allow(null),
  furnishingType: Joi.string().allow('').allow(null),
  parking: Joi.string().allow('').allow(null),

  // Commercial Specific
  pantry: Joi.string().allow('').allow(null),
  washroom: Joi.string().allow('').allow(null),
  cabin: Joi.string().allow('').allow(null),

  // Land Specific
  widthDepth: Joi.string().allow('').allow(null),
  roadTouch: Joi.string().allow('').allow(null),
  fencing: Joi.string().allow('').allow(null),
  titleClear: Joi.string().allow('').allow(null),

  // Industrial Specific
  waterSupply: Joi.string().allow('').allow(null),
  fireNOC: Joi.string().allow('').allow(null),
  loadingArea: Joi.number().min(1).allow(null),

  // Facilities, Amenities, Tags, Media
  amenities: Joi.array().items(Joi.string().allow('')).allow(null),
  tags: Joi.array().items(Joi.string().allow('')).allow(null),
  media: Joi.array().items(Joi.string().allow('')).allow(null),

  facilities: Joi.object()
    .pattern(
      Joi.string(),
      Joi.array().items(
        Joi.object({
          name: Joi.string().required(),
          address: Joi.string().required(),
          distance: Joi.string().required(),
          coordinates: Joi.array()
            .items(Joi.number().required())
            .length(2)
            .required(),
        }),
      ),
    )
    .allow(null),

  latitude: Joi.number().allow(null),
  longitude: Joi.number().allow(null),
  placeId: Joi.string().allow('').allow(null),
  propertyTags: Joi.array().items(Joi.string().allow('')),
  distance: Joi.number().allow(null),
  mediaUrls: Joi.array().items(Joi.string().allow('')),
  status: Joi.string().valid('active', 'inactive', 'draft').default('active'),
  createdBy: Joi.string().allow(''),
  updatedBy: Joi.string().allow(''),
  isSharing: Joi.boolean(),
};

const sellPropertyValidation = {
  price: Joi.number().required(),
  ownershipType: Joi.string().min(1).required(),
  brokerageAvailable: Joi.string().required(),
  brokerageAmount: Joi.number()
    .min(0)
    .when('brokerageAvailable', {
      is: 'yes',
      then: Joi.number().required(),
      otherwise: Joi.number().allow(null),
    }),
  availability: Joi.string().min(1).required(),
};

const rentPropertyValidation = {
  monthlyRent: Joi.number().required(),
  securityDeposit: Joi.number().required(),
  maintenanceCharges: Joi.number().required(),
  brokerageAvailable: Joi.string().required(),
  brokerageAmount: Joi.number()
    .min(0)
    .when('brokerageAvailable', {
      is: 'yes',
      then: Joi.number().required(),
      otherwise: Joi.number().allow(null),
    }),
  lockInPeriod: Joi.string().min(1).required(),
  leaseDuration: Joi.string().min(1).required(),
  agreementType: Joi.string().min(1).required(),
  availableFrom: Joi.string().min(1).required(),
};

const leasePropertyValidation = {
  monthlyRent: Joi.number().required(),
  securityDeposit: Joi.number().required(),
  maintenanceCharges: Joi.number().required(),
  lockInPeriod: Joi.string().min(1).required(),
  leaseDuration: Joi.string().min(1).required(),
  agreementType: Joi.string().min(1).required(),
};

const preLeasedPropertyValidation = {
  monthlyRent: Joi.number().required(),
  tenantName: Joi.string().min(1).required(),
  leaseDuration: Joi.string().min(1).required(),
  lockInPeriod: Joi.string().min(1).required(),
  roiPercentage: Joi.number().min(1).required(),
  leaseStartDate: Joi.string().min(1).required(),
  leaseEndDate: Joi.string().min(1).required(),
};

const createPrimaryProperty = {
  body: Joi.object().keys({
    ...basePropertyValidation,
    ...sellPropertyValidation,
    ...rentPropertyValidation,
    ...leasePropertyValidation,
    ...preLeasedPropertyValidation,
  }),
};

const getPrimaryProperties = {
  query: Joi.object().keys({
    title: Joi.string().allow(''),
    propertyType: Joi.string().allow(''),
    subcategory: Joi.string().allow(''),
    availableFor: Joi.string().allow(''),
    state: Joi.string().allow(''),
    city: Joi.string().allow(''),
    locality: Joi.string().allow(''),
    pincode: Joi.string().allow(''),
    sortBy: Joi.string().allow(''),
    limit: Joi.number().integer().min(1),
    page: Joi.number().integer().min(-1),
    companyId: Joi.string(),
  }),
};

const getProjectNamesFromProperties = {
  query: Joi.object().keys({
    companyId: Joi.string(),
    status: Joi.string().valid('active', 'inactive', 'draft'),
  }),
};

const getPrimaryProperty = {
  params: Joi.object().keys({
    propertyId: Joi.string().custom(objectId),
  }),
};

const updatePrimaryProperty = {
  params: Joi.object().keys({
    propertyId: Joi.custom(objectId),
  }),
  body: Joi.object().min(1),
};

const deletePrimaryProperty = {
  params: Joi.object().keys({
    propertyId: Joi.string().custom(objectId),
  }),
};

const updatePropertySource = {
  params: Joi.object().keys({
    propertyId: Joi.string().custom(objectId),
  }),
  body: Joi.object().keys({
    source: Joi.array().items(
      Joi.object({
        sourceProjectId: Joi.string().required(),
        id: Joi.string().custom(objectId).required(),
      }),
    ).required(),
  }),
};

const getPropertyVisibility = {
  params: Joi.object().keys({
    propertyId: Joi.string().custom(objectId),
  }),
};

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

const bulkDeletePrimaryProperty = {
  body: Joi.object().keys({
    propertyIds: Joi.array()
      .items(Joi.string().custom(objectId))
      .min(1)
      .required(),
  }),
};

const bulkUpdate = {
  body: Joi.object().keys({
    propertyIds: Joi.array()
      .items(Joi.string().custom(objectId))
      .min(1)
      .required(),
    possessionStatus: Joi.string().required(),
  }),
};

const bulkUpdatePropertyVisibility = {
  body: Joi.object().keys({
    propertyIds: Joi.array()
      .items(Joi.string().custom(objectId))
      .min(1)
      .required(),
    isPublicVisibility: Joi.boolean().required(),
  }),
};

const getPropertyVisitors = {
  params: Joi.object().keys({
    propertyId: Joi.string().custom(objectId).required(),
  }),
  query: Joi.object().keys({
    status: Joi.string().valid('pending', 'completed', 'overdue').optional(),
    page: Joi.number().min(1).default(1),
    limit: Joi.number().min(1).max(100).default(10),
  }),
};

export default {
  createPrimaryProperty,
  getPrimaryProperties,
  getPrimaryProperty,
  updatePrimaryProperty,
  deletePrimaryProperty,
  getProjectNamesFromProperties,
  updatePropertySource,
  getPropertyVisibility,
  updatePropertyVisibility,
  bulkDeletePrimaryProperty,
  bulkUpdatePropertyVisibility,
  bulkUpdate,
  getPropertyVisitors,
};
