import { Controller, Get, Param, Query } from '@nestjs/common';
import { ApiOkResponse, ApiTags } from '@nestjs/swagger';
import { ShopsService } from './shops.service';

@ApiTags('shops')
@Controller('shops')
export class ShopsController {
  constructor(private readonly shops: ShopsService) {}

  @Get('nearby')
  @ApiOkResponse({
    description:
      'Public nearby shops list (approved + active). If lat/lng provided, sorts by distance when coords exist.',
  })
  nearby(
    @Query('lat') lat?: string,
    @Query('lng') lng?: string,
    @Query('limit') limit?: string,
    @Query('radiusKm') radiusKm?: string,
  ) {
    const takeRaw = limit ? Number(limit) : 10;
    const take = Number.isFinite(takeRaw)
      ? Math.min(Math.max(Math.floor(takeRaw), 1), 50)
      : 10;
    const latNum = lat != null && lat !== '' ? Number(lat) : null;
    const lngNum = lng != null && lng !== '' ? Number(lng) : null;
    const radiusRaw = radiusKm ? Number(radiusKm) : 10;
    const radius =
      Number.isFinite(radiusRaw) && radiusRaw > 0
        ? Math.min(Math.max(Number(radiusRaw), 0.5), 50)
        : 10;
    const parsedLat = Number.isFinite(latNum as any)
      ? (latNum as number)
      : null;
    const parsedLng = Number.isFinite(lngNum as any)
      ? (lngNum as number)
      : null;
    return this.shops.listNearby({
      lat: parsedLat,
      lng: parsedLng,
      take,
      radiusKm: radius,
    });
  }

  @Get('username-available')
  @ApiOkResponse({ description: 'Checks if a shop username is available' })
  usernameAvailable(@Query('username') username: string) {
    return this.shops.usernameAvailable(username);
  }

  @Get('by-username/:username')
  @ApiOkResponse({
    description: 'Public shop lookup by @username (approved + active only)',
  })
  byUsername(@Param('username') username: string) {
    return this.shops.getPublicByUsername(username);
  }

  @Get('public')
  @ApiOkResponse({
    description:
      'Public approved shops list with pagination and search suggestions',
  })
  listPublic(
    @Query('q') q?: string,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    const p = page ? Number(page) : 1;
    const l = limit ? Number(limit) : 20;
    const pageNum = Number.isFinite(p) ? Math.max(1, Math.floor(p)) : 1;
    const limitNum = Number.isFinite(l)
      ? Math.min(100, Math.max(1, Math.floor(l)))
      : 20;
    return this.shops.listPublic({ q, page: pageNum, limit: limitNum });
  }
}
