import { z } from 'zod'; export const TRANSACTION_TYPES = [ { value: 'SALE', label: 'Bán' }, { value: 'RENT', label: 'Cho thuê' }, ] as const; export const PROPERTY_TYPES = [ { value: 'APARTMENT', label: 'Căn hộ' }, { value: 'HOUSE', label: 'Nhà riêng' }, { value: 'VILLA', label: 'Biệt thự' }, { value: 'LAND', label: 'Đất nền' }, { value: 'OFFICE', label: 'Văn phòng' }, { value: 'SHOPHOUSE', label: 'Shophouse' }, ] as const; export const DIRECTIONS = [ { value: 'NORTH', label: 'Bắc' }, { value: 'SOUTH', label: 'Nam' }, { value: 'EAST', label: 'Đông' }, { value: 'WEST', label: 'Tây' }, { value: 'NORTHEAST', label: 'Đông Bắc' }, { value: 'NORTHWEST', label: 'Tây Bắc' }, { value: 'SOUTHEAST', label: 'Đông Nam' }, { value: 'SOUTHWEST', label: 'Tây Nam' }, ] as const; export const FURNISHING_OPTIONS = [ { value: 'FULLY_FURNISHED', label: 'Đầy đủ nội thất' }, { value: 'BASIC_FURNISHED', label: 'Nội thất cơ bản' }, { value: 'UNFURNISHED', label: 'Bàn giao thô' }, ] as const; export const PROPERTY_CONDITION_OPTIONS = [ { value: 'NEW', label: 'Mới' }, { value: 'LIKE_NEW', label: 'Như mới' }, { value: 'RENOVATED', label: 'Đã cải tạo' }, { value: 'USED', label: 'Đã qua sử dụng' }, ] as const; export const VIEW_TYPE_OPTIONS = [ { value: 'Sông', label: 'Sông' }, { value: 'Thành phố', label: 'Thành phố' }, { value: 'Công viên', label: 'Công viên' }, { value: 'Hồ bơi', label: 'Hồ bơi' }, { value: 'Sân vườn', label: 'Sân vườn' }, { value: 'Biển', label: 'Biển' }, { value: 'Nội khu', label: 'Nội khu' }, ] as const; export const LISTING_STATUSES = { DRAFT: { label: 'Nháp', variant: 'secondary' as const }, PENDING_REVIEW: { label: 'Chờ duyệt', variant: 'warning' as const }, ACTIVE: { label: 'Đang bán', variant: 'success' as const }, RESERVED: { label: 'Đã đặt cọc', variant: 'info' as const }, SOLD: { label: 'Đã bán', variant: 'default' as const }, RENTED: { label: 'Đã cho thuê', variant: 'default' as const }, EXPIRED: { label: 'Hết hạn', variant: 'destructive' as const }, REJECTED: { label: 'Bị từ chối', variant: 'destructive' as const }, }; // ─── Step 1: Basic Info ────────────────────────────────── export const listingBasicSchema = z.object({ transactionType: z.enum(['SALE', 'RENT'], { message: 'Vui lòng chọn loại giao dịch', }), propertyType: z.enum(['APARTMENT', 'HOUSE', 'VILLA', 'LAND', 'OFFICE', 'SHOPHOUSE'], { message: 'Vui lòng chọn loại bất động sản', }), title: z.string().min(5, 'Tiêu đề tối thiểu 5 ký tự'), description: z.string().min(10, 'Mô tả tối thiểu 10 ký tự'), }); // ─── Step 2: Location ──────────────────────────────────── export const listingLocationSchema = z.object({ address: z.string().min(1, 'Vui lòng nhập địa chỉ'), ward: z.string().min(1, 'Vui lòng nhập phường/xã'), district: z.string().min(1, 'Vui lòng nhập quận/huyện'), city: z.string().min(1, 'Vui lòng nhập tỉnh/thành phố'), latitude: z.string().optional(), longitude: z.string().optional(), }); // ─── Step 3: Details ───────────────────────────────────── export const listingDetailsSchema = z.object({ areaM2: z.string().min(1, 'Diện tích tối thiểu 1 m²'), usableAreaM2: z.string().optional(), bedrooms: z.string().optional(), bathrooms: z.string().optional(), floors: z.string().optional(), floor: z.string().optional(), totalFloors: z.string().optional(), direction: z.string().optional(), yearBuilt: z.string().optional(), legalStatus: z.string().optional(), amenities: z.string().optional(), projectName: z.string().optional(), // Rich property fields (Phase B) furnishing: z.string().optional(), propertyCondition: z.string().optional(), balconyDirection: z.string().optional(), maintenanceFeeVND: z.string().optional(), parkingSlots: z.string().optional(), viewType: z.string().optional(), // comma-separated petFriendly: z.string().optional(), // '' | 'true' | 'false' suitableFor: z.string().optional(), // comma-separated whyThisLocation: z.string().max(2000, 'Tối đa 2000 ký tự').optional(), }); // ─── Step 4: Pricing ───────────────────────────────────── export const listingPricingSchema = z.object({ priceVND: z.string().min(1, 'Vui lòng nhập giá'), rentPriceMonthly: z.string().optional(), commissionPct: z.string().optional(), }); // ─── Full Schema ───────────────────────────────────────── export const createListingSchema = listingBasicSchema .merge(listingLocationSchema) .merge(listingDetailsSchema) .merge(listingPricingSchema); export type ListingBasicData = z.infer; export type ListingLocationData = z.infer; export type ListingDetailsData = z.infer; export type ListingPricingData = z.infer; export type CreateListingFormData = z.infer;