import raw from '../../../shared/sale.json';
/** Ne satılıyor: boş arsa, parselin tamamı (yapıyla), parseldeki yapılardan biri, bağımsız bölüm ya da hisse. */
export type SaleType = 'arsa' | 'tamami' | 'yapi' | 'bagimsiz' | 'hisse';
export const SALE_TYPES = raw.types as { id: SaleType; label: string; hint: string }[];
export const UNIT_TYPES = raw.units as string[];
export const SALE_IDS = SALE_TYPES.map((t) => t.id) as [SaleType, ...SaleType[]];
/** Satış türüyle ilgili hangi alanların sorulacağı */
export const needsUnit = (t: SaleType) => t === 'tamami' || t === 'yapi' || t === 'bagimsiz';
export const saleLabel = (t?: string | null) => SALE_TYPES.find((x) => x.id === t)?.label ?? SALE_TYPES[0].label;

/** Sipariş kaydından insan okunur özet: "Parseldeki yapılardan biri · Müstakil ev · 140 m² · 3+1" */
export function saleSummary(o: { saleType?: string | null; unitType?: string | null; unitArea?: number | null; rooms?: string | null; floorNo?: string | null; buildYear?: number | null; share?: string | null }) {
  if (!o.saleType || o.saleType === 'arsa') return null;
  return [saleLabel(o.saleType), o.unitType, o.unitArea ? `${Math.round(o.unitArea).toLocaleString('tr-TR')} m²` : null, o.rooms,
    o.floorNo ? (/^\d+$/.test(o.floorNo) ? `${o.floorNo}. kat` : o.floorNo) : null, o.buildYear ? `${o.buildYear} yapımı` : null, o.share ? `${o.share} hisse` : null].filter(Boolean).join(' · ');
}

/** Nokta poligonun içinde mi (ışın atma) — haritada seçilen yapının parsel içinde olduğunu doğrulamak için */
/** Çokgen alanı (m²), yerel düzlem yaklaşımı; parsel ölçeğinde yeterince doğru */
export function ringArea(r: number[][]) {
  if (r.length < 3) return 0;
  const kx = 111320 * Math.cos((r[0][1] * Math.PI) / 180), ky = 110540; let s = 0;
  for (let i = 0; i < r.length; i++) { const [a, b] = r[i], [c, d] = r[(i + 1) % r.length]; s += a * kx * d * ky - c * kx * b * ky; }
  return Math.abs(s / 2);
}
export function inPolygon([x, y]: [number, number], ring: number[][]) {
  let inside = false;
  for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
    const [xi, yi] = ring[i], [xj, yj] = ring[j];
    if ((yi > y) !== (yj > y) && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) inside = !inside;
  }
  return inside;
}
