import { GoogleAuthProvider, OAuthProvider, signInWithPopup, type Auth } from '@firebase/auth'
import { ApiCallback } from '~/api/apiCallback'
import { requestLoginSocial } from '~/api/apiTools'
import { useLoginStore } from '~/stores/LoginStore'
import { cancelLoading, showLoading } from '~/utils/BaseFunction'

export const useSocialAuth = () => {
  const { $auth } = useNuxtApp()
  const auth = $auth as Auth
  const loginStore = useLoginStore()

  // Google Provider
  const googleProvider = new GoogleAuthProvider()
  googleProvider.addScope('profile')
  googleProvider.addScope('email')

  // Apple Provider
  const appleProvider = new OAuthProvider('apple.com')
  appleProvider.addScope('email')
  appleProvider.addScope('name')

  /**
   * 執行第三方登入行為
   * @param method 'google' | 'apple'
   * @param rememberMe 是否記住登入狀態
   * @param onSuccess 成功後的額外回呼（通常用來獲取詳細資料）
   */
  const performSocialLogin = async (
    method: 'google' | 'apple',
    rememberMe: boolean = false,
    onSuccess: (method: string) => void,
  ) => {
    const provider = method === 'google' ? googleProvider : appleProvider

    try {
      const result = await signInWithPopup(auth, provider)
      const user = result.user
      const uid = user.uid
      const email = user.email || ''

      // 取得資料後立即登出 Firebase，保持狀態單純
      await auth.signOut()

      return new Promise((resolve, reject) => {
        requestLoginSocial(
          method,
          uid,
          email,
          new ApiCallback({
            startCallback: () => showLoading(),
            completeCallback: () => cancelLoading(),
            failCallback: () => reject(new Error('Social login failed')),
            successCallback: (data) => {
              loginStore.login(data.data.accessToken, data.data.refreshToken, rememberMe)
              onSuccess(method)
              resolve(data)
            },
          }),
        )
      })
    } catch (error) {
      console.error(`${method} login error:`, error)
      throw error
    }
  }

  return {
    performSocialLogin,
  }
}
