import { Injectable } from '@nestjs/common';
import { PrismaService } from '@core/database/prisma/prisma.service';

/**
 * v1.2 城市自动补全服务
 * 数据源：users.work_city + meetings.city + meeting_series.city（非空聚合去重）
 * 字符串直接存储（trim 后原样，区分大小写）
 */
@Injectable()
export class CitiesService {
  constructor(private readonly prisma: PrismaService) {}

  async listCitySuggestions(query: { keyword?: string; limit?: number | string }) {
    const keyword = (query.keyword || '').trim().toLowerCase();
    const limit = Math.max(1, Math.min(200, Number(query.limit) || 50));

    const [userRows, meetingRows, seriesRows] = await Promise.all([
      this.prisma.user.findMany({
        where: { deletedAt: null, workCity: { not: null } } as any,
        select: { workCity: true } as any,
        distinct: ['workCity' as any],
      }),
      (this.prisma as any).meeting.findMany({
        where: { city: { not: null } },
        select: { city: true },
        distinct: ['city'],
      }),
      (this.prisma as any).meetingSeries.findMany({
        where: { city: { not: null } },
        select: { city: true },
        distinct: ['city'],
      }),
    ]);

    const set = new Set<string>();
    for (const row of userRows as any[]) {
      const v = row.workCity?.trim();
      if (v) set.add(v);
    }
    for (const row of meetingRows) {
      const v = row.city?.trim();
      if (v) set.add(v);
    }
    for (const row of seriesRows) {
      const v = row.city?.trim();
      if (v) set.add(v);
    }

    let items = Array.from(set);
    if (keyword) {
      items = items.filter((c) => c.toLowerCase().includes(keyword));
    }
    items.sort((a, b) => a.localeCompare(b));
    return { items: items.slice(0, limit) };
  }
}
