const API_URL = process.env.NEXT_PUBLIC_API_URL ?? "http://10.113.245.13:8000"

export interface AppelOffreDoc {
  name: string
  size: string
  path: string
}

export interface AppelOffre {
  id: number
  reference: string
  /** Depuis que l'avis se depose au lieu de se ressaisir, ces trois champs
   *  ne sont plus renseignes : seuls les avis anterieurs les portent. */
  title: string | null
  description: string | null
  category: "equipment" | "services" | "supplies" | "works" | null
  deadline: string
  publish_date: string
  status: "active" | "closed"
  /** Affiché sur le site public. Un avis retiré n'est servi qu'à un
   *  administrateur authentifié, qui peut ainsi le republier. */
  is_published?: boolean
  documents: AppelOffreDoc[]
  pdf_url: string | null
  days_until_deadline: number
  is_urgent: boolean
}

/**
 * @param entetes en-tête d'authentification, quand un administrateur consulte
 *        la page : il reçoit alors aussi les avis retirés du site.
 */
export async function fetchAppelOffres(
  locale = "fr",
  entetes?: Record<string, string>
): Promise<AppelOffre[]> {
  const admin = Boolean(entetes && Object.keys(entetes).length > 0)
  try {
    const res = await fetch(
      `${API_URL}/api/appel-offres?locale=${locale}${admin ? "&include_unpublished=1" : ""}`,
      admin
        // Une réponse qui dépend du jeton ne doit jamais être mise en cache.
        ? { headers: entetes, cache: "no-store" }
        : { next: { revalidate: 60 } }
    )
    if (!res.ok) return []
    return res.json()
  } catch {
    return []
  }
}

export async function fetchAppelOffre(
  id: string,
  locale = "fr"
): Promise<AppelOffre | null> {
  try {
    const res = await fetch(`${API_URL}/api/appel-offres/${id}?locale=${locale}`, {
      next: { revalidate: 60 },
    })
    if (!res.ok) return null
    return res.json()
  } catch {
    return null
  }
}
