// BEGIN CHANGE: provider de autenticacao client-side (token em localStorage)
"use client";

import { createContext, useContext, useEffect, useState } from "react";

export type Character = {
  name: string;
  level: number;
  vocation: string;
  look?: import("@/lib/api").Look;
  deleted?: boolean;
  online?: boolean;
  comment?: string;
  oldName?: string;
  namelocked?: boolean;
  forSale?: boolean;
};
export type Account = {
  name: string;
  premiumPoints?: number;
  backupPoints?: number;
  pageAccess?: number;
  isAdmin?: boolean;
  canAccessAdminPanel?: boolean;
  email?: string;
  emailMasked?: string;
  hasEmail?: boolean;
  emailNew?: string;
  emailNewTime?: number;
  hasRecoveryKey?: boolean;
  rlname?: string;
  location?: string;
  premdays?: number;
  // BEGIN CHANGE: Premium Account ativa (premdays/lastday)
  isPremium?: boolean;
  // END CHANGE
  created?: number;
  reckeyPrice?: number;
  maxChars?: number;
};

type Session = { token: string; account: Account; characters: Character[] };

type AuthContext = {
  ready: boolean;
  token: string | null;
  account: Account | null;
  characters: Character[];
  setSession: (s: Session) => void;
  logout: () => void;
};

const TOKEN_KEY = "wa_token";
const ACC_KEY = "wa_account";
const Ctx = createContext<AuthContext | null>(null);

export function AuthProvider({ children }: { children: React.ReactNode }) {
  const [ready, setReady] = useState(false);
  const [token, setToken] = useState<string | null>(null);
  const [account, setAccount] = useState<Account | null>(null);
  const [characters, setCharacters] = useState<Character[]>([]);

  useEffect(() => {
    const t = localStorage.getItem(TOKEN_KEY);
    const a = localStorage.getItem(ACC_KEY);
    if (t && a) {
      try {
        setToken(t);
        setAccount(JSON.parse(a));
      } catch {
        localStorage.removeItem(TOKEN_KEY);
        localStorage.removeItem(ACC_KEY);
      }
    }
    setReady(true);
  }, []);

  const setSession = (s: Session) => {
    setToken(s.token);
    setAccount(s.account);
    setCharacters(s.characters ?? []);
    localStorage.setItem(TOKEN_KEY, s.token);
    localStorage.setItem(ACC_KEY, JSON.stringify(s.account));
  };

  const logout = () => {
    setToken(null);
    setAccount(null);
    setCharacters([]);
    localStorage.removeItem(TOKEN_KEY);
    localStorage.removeItem(ACC_KEY);
  };

  return (
    <Ctx.Provider value={{ ready, token, account, characters, setSession, logout }}>
      {children}
    </Ctx.Provider>
  );
}

export function useAuth() {
  const ctx = useContext(Ctx);
  if (!ctx) throw new Error("useAuth must be used within AuthProvider");
  return ctx;
}
// END CHANGE
