import { Schema } from "mongoose";
import { applyIdTransform, registerModel, stringId } from "../schema";
import { createId } from "../ids";
import { PROPERTY_STATUSES } from "../types";

const PropertyImageSchema = new Schema(
  {
    _id: { type: String, default: createId },
    url: { type: String, required: true },
    sortOrder: { type: Number, default: 0 },
    createdAt: { type: Date, default: Date.now },
  },
  { _id: true },
);

const PropertyVideoSchema = new Schema(
  {
    _id: { type: String, default: createId },
    url: { type: String, required: true },
    sortOrder: { type: Number, default: 0 },
    createdAt: { type: Date, default: Date.now },
  },
  { _id: true },
);

const PropertySchema = new Schema(
  {
    _id: stringId,
    ownerId: { type: String, ref: "User", required: true, index: true },
    cityId: { type: String, ref: "City", required: true, index: true },
    titleAr: { type: String, required: true },
    titleEn: { type: String, required: true },
    slug: { type: String, required: true, unique: true },
    descriptionAr: { type: String, required: true },
    descriptionEn: { type: String, required: true },
    address: { type: String, required: true },
    latitude: { type: Number, default: undefined },
    longitude: { type: Number, default: undefined },
    status: { type: String, enum: PROPERTY_STATUSES, default: "DRAFT" },
    bedrooms: { type: Number, required: true },
    bathrooms: { type: Number, required: true },
    maxGuests: { type: Number, required: true, index: true },
    wifi: { type: Boolean, default: false },
    parking: { type: Boolean, default: false },
    airConditioning: { type: Boolean, default: false },
    kitchen: { type: Boolean, default: false },
    hospitalNearby: { type: Boolean, default: false },
    universityNearby: { type: Boolean, default: false },
    petFriendly: { type: Boolean, default: false },
    instantBooking: { type: Boolean, default: false },
    basePriceTnd: { type: Number, required: true },
    cleaningFeeTnd: { type: Number, default: 0 },
    /** Local time strings HH:mm for guest arrival / departure */
    checkInTime: { type: String, default: "15:00" },
    checkOutTime: { type: String, default: "11:00" },
    cancellationPolicy: { type: String, required: true },
    houseRules: { type: String, default: undefined },
    featured: { type: Boolean, default: false },
    deletedAt: { type: Date, default: undefined },
    images: { type: [PropertyImageSchema], default: [] },
    videos: { type: [PropertyVideoSchema], default: [] },
    /** YYYY-MM-DD dates the owner marks as unavailable */
    blockedDates: { type: [String], default: [] },
  },
  { timestamps: true },
);

PropertySchema.index({ status: 1, featured: 1 });
PropertySchema.index({ deletedAt: 1 });
applyIdTransform(PropertySchema);

export const Property = registerModel("Property", PropertySchema);
