/**
 * Тонкая обёртка над axios `api`, использующая типы из api.generated.ts
 * (сгенерированы из /swagger/v1/swagger.json через openapi-typescript).
 *
 * Регенерация:
 *   1. dotnet run --project src/food-market.api  (или просто запущенный API в dev)
 *   2. cd src/food-market.web && pnpm run gen:api
 *      → перезаписывает src/lib/api.generated.ts
 *
 * Эта обёртка демонстрирует подключение для пары контроллеров (reports/sales,
 * reports/abc) как образец миграции с ручных типов. Остальные страницы
 * пользуются явными типами из `types.ts` — постепенная миграция в новом коде.
 *
 * Multi-tenant: контроллеры на API-стороне применяют tenant query-filter
 * автоматически, обёртка ничего не делает специального — только подставляет
 * Authorization-токен (через axios interceptor в `api.ts`).
 */
import { api } from './api'
import type { components, paths } from './api.generated'

/** Типы DTO, переэкспорт из generated для удобства импорта на страницах. */
export type SalesReportRowDto = components['schemas']['Reports_SalesReportController_SalesRow']
export type AbcReportRowDto = components['schemas']['Reports_AbcReportController_AbcRow']
export type ProfitReportRowDto = components['schemas']['Reports_ProfitReportController_ProfitRow']

type SalesQuery = NonNullable<paths['/api/reports/sales']['get']['parameters']['query']>
type AbcQuery = NonNullable<paths['/api/reports/abc']['get']['parameters']['query']>
type ProfitQuery = NonNullable<paths['/api/reports/profit']['get']['parameters']['query']>

function qs(params: Record<string, unknown>): string {
  const p = new URLSearchParams()
  for (const [k, v] of Object.entries(params)) {
    if (v == null || v === '') continue
    p.set(k, v instanceof Date ? v.toISOString() : String(v))
  }
  return p.toString()
}

/** Тонкие хелперы, типизированные через generated types. */
export const reports = {
  async sales(params: SalesQuery): Promise<SalesReportRowDto[]> {
    const { data } = await api.get<SalesReportRowDto[]>(`/api/reports/sales?${qs(params)}`)
    return data
  },
  async abc(params: AbcQuery): Promise<AbcReportRowDto[]> {
    const { data } = await api.get<AbcReportRowDto[]>(`/api/reports/abc?${qs(params)}`)
    return data
  },
  async profit(params: ProfitQuery): Promise<ProfitReportRowDto[]> {
    const { data } = await api.get<ProfitReportRowDto[]>(`/api/reports/profit?${qs(params)}`)
    return data
  },
}
