// src/services/authService.tsx
import { Capacitor } from '@capacitor/core';
import { initializeApp, getApps, getApp, FirebaseApp } from 'firebase/app';
import {
  Auth,
  getAuth,
  initializeAuth,
  indexedDBLocalPersistence,
  browserLocalPersistence,
  signInWithEmailAndPassword,
  signOut,
  sendPasswordResetEmail,
  createUserWithEmailAndPassword,
  onAuthStateChanged,
  User,
  UserCredential,
} from 'firebase/auth';

const firebaseConfig = {
  apiKey: 'AIzaSyB6Al6H674ok4H5eCYNrV8b6whpL1WuVnE',
  authDomain: 'duper-3ff5e.firebaseapp.com',
  projectId: 'duper-3ff5e',
  storageBucket: 'duper-3ff5e.firebasestorage.app',
  messagingSenderId: '758674635177',
  appId: '1:758674635177:web:7b4c5dbccd333969daacb8',
};

const app: FirebaseApp = getApps().length ? getApp() : initializeApp(firebaseConfig);

/**
 * En Capacitor iOS, getAuth() cuelga signInWithEmailAndPassword (promise nunca resuelve).
 * Hay que usar initializeAuth + persistence nativa.
 * @see https://stackoverflow.com/questions/70429044
 */
function createAuth(firebaseApp: FirebaseApp): Auth {
  const native = Capacitor.isNativePlatform();
  console.log('[AUTH] init', {
    platform: Capacitor.getPlatform(),
    native,
    apps: getApps().length,
  });

  if (native) {
    try {
      const authNative = initializeAuth(firebaseApp, {
        persistence: indexedDBLocalPersistence,
      });
      console.log('[AUTH] initializeAuth + indexedDBLocalPersistence OK');
      return authNative;
    } catch (e: any) {
      // Ya inicializado (HMR / re-import)
      console.warn('[AUTH] initializeAuth ya existía, usando getAuth()', e?.message);
      return getAuth(firebaseApp);
    }
  }

  try {
    return initializeAuth(firebaseApp, {
      persistence: browserLocalPersistence,
    });
  } catch {
    return getAuth(firebaseApp);
  }
}

const auth = createAuth(app);

export class AuthServices {
  async register(email: string, password: string): Promise<UserCredential> {
    console.log('[AUTH] register →', email.trim());
    const cred = await createUserWithEmailAndPassword(auth, email.trim(), password);
    console.log('[AUTH] register OK', cred.user?.uid);
    return cred;
  }

  async login(email: string, password: string): Promise<UserCredential> {
    console.log('[AUTH] signInWithEmailAndPassword →', {
      email: email.trim(),
      platform: Capacitor.getPlatform(),
      projectId: firebaseConfig.projectId,
    });
    try {
      const cred = await signInWithEmailAndPassword(auth, email.trim(), password);
      console.log('[AUTH] signIn OK', { uid: cred.user?.uid, email: cred.user?.email });
      return cred;
    } catch (e: any) {
      console.error('[AUTH] signIn FAIL', { code: e?.code, message: e?.message });
      throw e;
    }
  }

  async logout(): Promise<void> {
    return signOut(auth);
  }

  async sendPasswordReset(email: string): Promise<void> {
    return sendPasswordResetEmail(auth, email.trim());
  }

  getUser(): Promise<User | null> {
    return new Promise((resolve) => {
      const unsub = onAuthStateChanged(auth, (user) => {
        unsub();
        resolve(user);
      });
    });
  }
}
