import { create } from "zustand";
import { getCurrentSeed, loginWithSeed, pollTelegramLogin } from "@/lib/api";

const LOGGED_IN_KEY = "nrxp_logged_in";

function markLoggedIn() {
  localStorage.setItem(LOGGED_IN_KEY, "1");
}

interface AuthState {
  /** Явный флаг "юзер прошёл экран входа" — отдельно от факта наличия
   * Ghost-токена: seed/токен могут тихо появиться в фоне (fetchNodes), это
   * не должно само по себе пускать на экран подключения. */
  isLoggedIn: boolean;

  seed: string | null;
  seedError: string | null;
  seedLoading: boolean;

  telegramCodeError: string | null;
  telegramCodeLoading: boolean;

  loadSeed: () => Promise<void>;
  /** Быстрый старт без явного seed/Telegram — переиспользует уже
   * сгенерированный в фоне Ghost-аккаунт либо создаёт новый. */
  continueAnonymously: () => Promise<void>;
  loginSeed: (seed: string) => Promise<void>;
  /** Код генерирует сам бот (кнопка "Код для входа") — уже подтверждённый,
   * поэтому это одноразовый обмен, а не поллинг deep-link'а (тот ненадёжен
   * для юзеров, уже открывавших бота — см. AuthService::create_bot_login_code). */
  loginTelegramCode: (code: string) => Promise<void>;
}

export const useAuthStore = create<AuthState>((set, get) => ({
  isLoggedIn: localStorage.getItem(LOGGED_IN_KEY) === "1",

  seed: null,
  seedError: null,
  seedLoading: false,

  telegramCodeError: null,
  telegramCodeLoading: false,

  loadSeed: async () => {
    set({ seedLoading: true, seedError: null });
    try {
      const seed = await getCurrentSeed();
      set({ seed, seedLoading: false });
    } catch {
      // Аккаунт залогинен через Telegram — своего seed нет, это не ошибка UI.
      set({ seed: null, seedLoading: false });
    }
  },

  continueAnonymously: async () => {
    set({ seedLoading: true, seedError: null });
    try {
      const seed = await getCurrentSeed();
      markLoggedIn();
      set({ seed, seedLoading: false, isLoggedIn: true });
    } catch {
      set({ seedLoading: false, seedError: "anon_failed" });
    }
  },

  loginSeed: async (seed: string) => {
    set({ seedLoading: true, seedError: null });
    try {
      await loginWithSeed(seed);
      markLoggedIn();
      set({ seed, seedLoading: false, isLoggedIn: true });
    } catch {
      set({
        seedError: "invalid_seed",
        seedLoading: false,
      });
    }
  },

  loginTelegramCode: async (code: string) => {
    set({ telegramCodeLoading: true, telegramCodeError: null });
    try {
      const confirmed = await pollTelegramLogin(code.trim());
      if (confirmed) {
        markLoggedIn();
        set({ telegramCodeLoading: false, isLoggedIn: true });
        await get().loadSeed();
      } else {
        // Код существует, но не подтверждён — при новом bot-флоу такого не
        // бывает (бот отдаёт код уже подтверждённым), но на всякий случай.
        set({ telegramCodeLoading: false, telegramCodeError: "not_verified" });
      }
    } catch {
      set({ telegramCodeLoading: false, telegramCodeError: "invalid_or_expired" });
    }
  },
}));
