import { Request, Response } from 'express';
import { prisma } from '../models';
import { GPSLockMiddleware } from '../middleware/gps-lock';
import { PitStatus } from '@prisma/client';

export const gpsController = {
  async verifyLocation(req: Request, res: Response) {
    const { pit_id, current_latitude, current_longitude } = req.body as {
      pit_id?: string;
      current_latitude?: number;
      current_longitude?: number;
    };
    if (!pit_id || current_latitude == null || current_longitude == null) {
      res.status(400).json({ success: false, error: 'Missing fields' });
      return;
    }

    const pit = await prisma.pit.findFirst({
      where: { id: pit_id, deleted_at: null },
      include: { license: true },
    });
    if (!pit) {
      res.status(404).json({ success: false, error: 'Pit not found' });
      return;
    }

    if (pit.status !== PitStatus.ACTIVE || !pit.operational_access) {
      res.status(403).json({
        success: false,
        error: 'This pit is not active. License may be expired.',
      });
      return;
    }

    const distance = GPSLockMiddleware.haversineDistance(
      current_latitude,
      current_longitude,
      pit.gps_latitude,
      pit.gps_longitude
    );

    res.json({
      success: true,
      data: {
        verified: distance <= 50,
        distance_meters: Math.round(distance * 10) / 10,
        max_allowed_meters: 50,
        pit_name: pit.pit_name || pit.pit_guid,
        pit_status: pit.status,
      },
    });
  },

  async reportSubmission(req: Request, res: Response) {
    const distance = (req.body as { gps_distance_meters?: number }).gps_distance_meters;
    res.json({
      success: true,
      data: {
        message: 'Report accepted (stub store in later module)',
        gps_distance_meters: distance,
        gps_verified_at: (req.body as { gps_verified_at?: Date }).gps_verified_at,
      },
    });
  },

  async pitDistance(req: Request, res: Response) {
    const { pitId } = req.params;
    const lat = parseFloat(String(req.query.lat ?? ''));
    const lng = parseFloat(String(req.query.lng ?? ''));
    if (Number.isNaN(lat) || Number.isNaN(lng)) {
      res.status(400).json({ success: false, error: 'lat and lng query params required' });
      return;
    }
    const pit = await prisma.pit.findFirst({ where: { id: pitId, deleted_at: null } });
    if (!pit) {
      res.status(404).json({ success: false, error: 'Pit not found' });
      return;
    }
    const d = GPSLockMiddleware.haversineDistance(lat, lng, pit.gps_latitude, pit.gps_longitude);
    res.json({
      success: true,
      data: {
        distance_meters: Math.round(d * 10) / 10,
        pit_id: pit.id,
      },
    });
  },
};
