import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { createContext, useContext, type ReactNode } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { api, unwrap } from '@/api/client';
import { ecrireJeton, effacerJeton } from '@/api/jeton';
import { viderFile } from '@/file/store';

/** Session mobile — mêmes règles que le web : le sélecteur démo n'existe
 *  que si l'API répond (ADR-002 : 404 sinon, une seule source de vérité). */

export function useMe() {
  return useQuery({
    queryKey: ['me'],
    retry: false,
    queryFn: async () => unwrap(await api.GET('/users/me')),
  });
}

export function useDemoAccounts() {
  return useQuery({
    queryKey: ['demo-accounts'],
    retry: false,
    queryFn: async () => {
      const res = await api.GET('/auth/demo-accounts');
      if (res.response.status === 404) return null; // démo désactivée
      return (await unwrap(res)).accounts;
    },
  });
}

function useApresConnexion() {
  const queryClient = useQueryClient();
  return async (accessToken: string) => {
    await ecrireJeton(accessToken);
    await queryClient.invalidateQueries();
  };
}

export function useLogin() {
  const apres = useApresConnexion();
  return useMutation({
    mutationFn: async (input: { email: string; password: string }) => {
      const res = await unwrap(await api.POST('/auth/login', { body: input }));
      await apres(res.accessToken);
    },
  });
}

export function useDemoLogin() {
  const apres = useApresConnexion();
  return useMutation({
    mutationFn: async (userId: string) => {
      const res = await unwrap(await api.POST('/auth/demo-login', { body: { userId } }));
      await apres(res.accessToken);
    },
  });
}

export function useLogout() {
  const queryClient = useQueryClient();
  return async () => {
    // Rien ne survit à la session sur l'appareil : jeton (trousseau), file
    // d'écriture, cache OT persisté (loi 09-08 — minimisation).
    await effacerJeton();
    viderFile();
    queryClient.clear();
    await AsyncStorage.removeItem('siop.cache');
  };
}

/** Drapeau hors-ligne partagé (pastille topbar + bandeaux d'écrans). */
export const HorsLigneContexte = createContext(false);
export const useHorsLigne = () => useContext(HorsLigneContexte);

export function HorsLigneProvider({
  valeur,
  children,
}: {
  valeur: boolean;
  children: ReactNode;
}) {
  return <HorsLigneContexte.Provider value={valeur}>{children}</HorsLigneContexte.Provider>;
}
