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

export interface SearchHit {
  type: 'unit' | 'model' | 'sku' | 'supplier' | 'customer' | 'location';
  id: string;
  title: string;
  subtitle?: string;
  href: string;
}

export interface SearchResult {
  units: SearchHit[];
  models: SearchHit[];
  skus: SearchHit[];
  suppliers: SearchHit[];
  customers: SearchHit[];
  locations: SearchHit[];
}

/**
 * 跨实体全局搜索（v3）。
 * Supplier/Customer/Location 已迁到 platform_master schema。
 */
@Injectable()
export class RobotSearchService {
  constructor(private readonly prisma: PrismaService) {}

  async search(q: string): Promise<SearchResult> {
    const query = q.trim();
    if (!query) {
      return { units: [], models: [], skus: [], suppliers: [], customers: [], locations: [] };
    }
    const like = { contains: query, mode: 'insensitive' as const };
    const take = 8;

    const [units, models, skus, suppliers, customers, locations] = await Promise.all([
      this.prisma.robotUnit.findMany({
        where: { deletedAt: null, OR: [{ ffsn: like }, { supplierSn: like }] },
        take,
        select: {
          id: true,
          ffsn: true,
          supplierSn: true,
          model: { select: { name: true } },
          sku: { select: { code: true } },
        },
      }),
      this.prisma.robotModel.findMany({
        where: { enabled: true, OR: [{ code: like }, { name: like }] },
        take,
        select: { id: true, code: true, name: true },
      }),
      this.prisma.robotSku.findMany({
        where: { enabled: true, OR: [{ code: like }, { name: like }] },
        take,
        select: { id: true, code: true, name: true },
      }),
      this.prisma.supplier.findMany({
        where: { deletedAt: null, enabled: true, OR: [{ code: like }, { name: like }] },
        take,
        select: { id: true, code: true, name: true },
      }),
      this.prisma.customer.findMany({
        where: { deletedAt: null, enabled: true, OR: [{ code: like }, { name: like }] },
        take,
        select: { id: true, code: true, name: true },
      }),
      this.prisma.location.findMany({
        where: { deletedAt: null, enabled: true, OR: [{ code: like }, { name: like }] },
        take,
        select: { id: true, code: true, name: true },
      }),
    ]);

    return {
      units: units.map((u) => ({
        type: 'unit' as const,
        id: u.id,
        title: u.ffsn,
        subtitle: `${u.model?.name ?? ''} / ${u.sku?.code ?? ''}`.trim(),
        href: `/robot-manager/${u.id}`,
      })),
      models: models.map((m) => ({
        type: 'model' as const,
        id: m.id,
        title: m.name,
        subtitle: m.code,
        href: `/robot-manager?modelId=${m.id}`,
      })),
      skus: skus.map((s) => ({
        type: 'sku' as const,
        id: s.id,
        title: s.name,
        subtitle: s.code,
        href: `/robot-manager?skuId=${s.id}`,
      })),
      suppliers: suppliers.map((s) => ({
        type: 'supplier' as const,
        id: s.id,
        title: s.name,
        subtitle: s.code,
        href: `/platform-master/suppliers/${s.id}`,
      })),
      customers: customers.map((c) => ({
        type: 'customer' as const,
        id: c.id,
        title: c.name,
        subtitle: c.code,
        href: `/platform-master/customers/${c.id}`,
      })),
      locations: locations.map((l) => ({
        type: 'location' as const,
        id: l.id,
        title: l.name,
        subtitle: l.code,
        href: `/platform-master/locations/${l.id}`,
      })),
    };
  }
}
