import { useQuery } from '@tanstack/react-query';
import { api } from '@/shared/lib/apiClient';

/**
 * useStudioProperties — Studio Pillar property listing
 */
export function useStudioProperties() {
  const query = useQuery({
    queryKey: ['studio-properties'],
    queryFn: async () => {
      const response = await api.get<InventoryPropertiesResponse | StudioProperty[]>('/inventory/properties');
      const rawProperties = Array.isArray(response)
        ? response
        : Array.isArray(response.properties)
          ? response.properties
          : [];
      return rawProperties.map(mapInventoryProperty);
    },
    staleTime: 120_000,
  });
  return { properties: query.data ?? [], isLoading: query.isLoading };
}

/**
 * useProperty — single property entity with full details
 */
export function useProperty(propertyId: string) {
  const query = useQuery({
    queryKey: ['property', propertyId],
    queryFn: async () => mapInventoryPropertyDetail(
      await api.get<InventoryPropertyRecord>(`/inventory/properties/${propertyId}`)
    ),
    staleTime: 120_000,
    enabled:  !!propertyId,
  });
  return { property: query.data, isLoading: query.isLoading };
}

// ── Types ────────────────────────────────────────────────────
export interface StudioProperty {
  id: string;
  name: string;
  location: string;
  priceRange?: string;
  thumbnailUrl?: string;
  availableUnits?: number;
}

export interface PropertyDetail {
  id: string;
  name: string;
  config: string;
  area: string;
  price: string;
  description?: string;
  thumbnailUrl?: string;
  interiorImageUrl?: string;
  modelUrl?: string;          // GLB/GLTF for R3F
  images?: string[];
  amenities?: string[];
}

interface InventoryPropertiesResponse {
  properties?: InventoryPropertyRecord[];
}

interface InventoryPropertyRecord {
  property_id?: string;
  id?: string;
  project_name?: string;
  name?: string;
  developer_name?: string;
  property_type?: string;
  location?: {
    city?: string;
    district?: string;
    area?: string;
    address?: string;
  };
  price_bands?: Array<{ label?: string; min?: number; max?: number; currency?: string }>;
  unit_mix?: Array<{ configuration?: string; count?: number; available?: number; area?: string; price?: string }>;
  amenities?: string[];
  media?: Array<{ url?: string; thumbnail_url?: string }>;
  images?: string[];
  thumbnailUrl?: string;
  availableUnits?: number;
}

function mapLocation(location: InventoryPropertyRecord['location']): string {
  if (!location) return 'Location pending';
  return [location.district, location.area, location.city, location.address].filter(Boolean).join(', ') || 'Location pending';
}

function mapPriceRange(priceBands: InventoryPropertyRecord['price_bands']): string | undefined {
  if (!Array.isArray(priceBands) || priceBands.length === 0) return undefined;
  const mins = priceBands.map((band) => Number(band.min)).filter(Number.isFinite);
  const maxes = priceBands.map((band) => Number(band.max)).filter(Number.isFinite);
  if (!mins.length && !maxes.length) return priceBands[0]?.label;
  const currency = priceBands[0]?.currency ?? 'INR';
  const min = mins.length ? Math.min(...mins) : undefined;
  const max = maxes.length ? Math.max(...maxes) : undefined;
  if (min !== undefined && max !== undefined) return `${currency} ${min} - ${max}`;
  if (min !== undefined) return `From ${currency} ${min}`;
  return `Up to ${currency} ${max}`;
}

function mapInventoryProperty(record: InventoryPropertyRecord): StudioProperty {
  const mediaThumb = Array.isArray(record.media) ? record.media.find((item) => item.thumbnail_url || item.url) : undefined;
  const availableUnits = Array.isArray(record.unit_mix)
    ? record.unit_mix.reduce((sum, unit) => sum + Number(unit.available ?? unit.count ?? 0), 0)
    : record.availableUnits;
  const stableId = record.property_id ?? record.id ?? record.project_name ?? record.name ?? 'unknown-property';
  return {
    id: String(stableId),
    name: record.project_name ?? record.name ?? 'Unnamed property',
    location: mapLocation(record.location),
    priceRange: mapPriceRange(record.price_bands),
    thumbnailUrl: record.thumbnailUrl ?? mediaThumb?.thumbnail_url ?? mediaThumb?.url,
    availableUnits,
  };
}

function mapInventoryPropertyDetail(record: InventoryPropertyRecord): PropertyDetail {
  const base = mapInventoryProperty(record);
  const primaryUnit = Array.isArray(record.unit_mix) ? record.unit_mix[0] : undefined;
  const images = Array.isArray(record.images)
    ? record.images
    : Array.isArray(record.media)
      ? record.media.map((item) => item.url).filter((url): url is string => Boolean(url))
      : [];
  return {
    ...base,
    config: primaryUnit?.configuration ?? record.property_type ?? 'Mixed configuration',
    area: primaryUnit?.area ?? 'Area pending',
    price: primaryUnit?.price ?? base.priceRange ?? 'Price pending',
    description: `${record.developer_name ?? 'Developer'} property in ${base.location}`,
    images,
    amenities: Array.isArray(record.amenities) ? record.amenities : [],
  };
}
