import { Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../../../prisma/prisma.service';

@Injectable()
export class DeliveryTrackingService {
  constructor(private readonly prisma: PrismaService) {}

  async getTracking(orderId: string) {
    return this.prisma.deliveryTracking.findUnique({
      where: { orderId },
    });
  }

  async upsertTracking(
    orderId: string,
    data: {
      driverName?: string;
      driverPhone?: string;
      status?: string;
      currentLat?: number;
      currentLng?: number;
      etaMinutes?: number;
      notes?: string;
      notifiedAt?: Date;
    },
  ) {
    // Ensure the order exists
    const order = await this.prisma.order.findUnique({ where: { id: orderId } });
    if (!order) throw new NotFoundException(`Order ${orderId} not found`);

    return this.prisma.deliveryTracking.upsert({
      where: { orderId },
      create: { orderId, ...data },
      update: { ...data },
    });
  }

  async getPublicTracking(orderId: string) {
    const tracking = await this.prisma.deliveryTracking.findUnique({
      where: { orderId },
      include: {
        order: {
          select: {
            id: true,
            orderNumber: true,
            customerName: true,
            customerPhone: true,
            deliveryAddress: true,
            deliveryLat: true,
            deliveryLng: true,
            status: true,
            business: { select: { name: true } },
          },
        },
      },
    });

    if (!tracking) {
      // Return minimal order info even if no tracking created yet
      const order = await this.prisma.order.findUnique({
        where: { id: orderId },
        select: {
          id: true,
          orderNumber: true,
          customerName: true,
          status: true,
          deliveryAddress: true,
          deliveryLat: true,
          deliveryLng: true,
          business: { select: { name: true } },
        },
      });
      if (!order) throw new NotFoundException('Order not found');
      return { tracking: null, order };
    }

    return { tracking, order: tracking.order };
  }
}
