import apiClient, { ApiClientError } from "./apiClient";
import type { ApiEnvelope } from "../types/auth";
import type { BottlesPayload } from "../types/bottle";

// Resultat volontairement discriminable : une instance qui n'expose pas encore
// l'endpoint /mobile/bottles.php (vieux backend coolcare ou missioflow non mis
// a jour) renvoie un 404. On le traduit en `available: false` au lieu de lever,
// pour que l'app reste fonctionnelle sur TOUTES les instances (coolcare ET
// missioflow), conformement a la contrainte thin-client multi-backend.
export type BottlesResult =
  | { available: true; payload: BottlesPayload }
  | { available: false };

export async function getMyBottles(): Promise<BottlesResult> {
  try {
    const response = await apiClient.get<ApiEnvelope<BottlesPayload>>(
      "/mobile/bottles.php"
    );

    if (!response.data?.success || !response.data.data) {
      throw new Error(response.data?.message || "Bouteilles indisponibles");
    }

    const payload = response.data.data;
    return {
      available: true,
      payload: {
        bottles: Array.isArray(payload.bottles) ? payload.bottles : [],
        count: Number.isFinite(payload.count) ? Number(payload.count) : 0,
        quota: Number.isFinite(payload.quota) ? Number(payload.quota) : 0,
        technicien_id: Number(payload.technicien_id || 0),
      },
    };
  } catch (error) {
    if (error instanceof ApiClientError && error.status === 404) {
      return { available: false };
    }
    throw error;
  }
}

export type BottleAction =
  | "request_return"
  | "confirm_drop"
  | "drop_to_stock"
  | "exchange";

export type BottleActionExtra = {
  commentaire?: string;
  numero_serie_nouvelle?: string;
  type_nouvelle?: string;
};

// Declenche une action tech sur une bouteille via /mobile/bottle_action.php.
// Le backend force le technicien_id depuis le JWT et revalide statut +
// appartenance : un message d'erreur metier (mauvais statut, etc.) remonte ici
// en Error pour affichage. Online-only : pas de file offline (mutation rare,
// l'etat backend reste la source de verite).
export async function postBottleAction(
  action: BottleAction,
  bottleId: number,
  extra: BottleActionExtra = {}
): Promise<void> {
  const response = await apiClient.post<ApiEnvelope<unknown>>(
    "/mobile/bottle_action.php",
    { action, bottle_id: bottleId, ...extra }
  );

  if (!response.data?.success) {
    throw new Error(response.data?.message || "Action impossible");
  }
}
