'use client';

import { createContext, useContext, useState, useEffect, ReactNode } from 'react';
import { auth, db } from '@/lib/firebase';
import {
  onAuthStateChanged,
  signOut,
  PhoneAuthProvider,
  signInWithCredential,
  User as FirebaseUser,
} from 'firebase/auth';
import { doc, getDoc, setDoc } from 'firebase/firestore';

interface UserData {
  id: string;
  phoneNumber: string;
  displayName: string | null;
  photoURL: string | null;
  createdAt: Date;
  isAdmin: boolean;
}

interface AuthContextType {
  user: FirebaseUser | null;
  userData: UserData | null;
  loading: boolean;
  isAdmin: boolean;
  signOutUser: () => Promise<void>;
  verifyPhoneCode: (verificationId: string, code: string) => Promise<void>;
}

const AuthContext = createContext<AuthContextType>({
  user: null,
  userData: null,
  loading: true,
  isAdmin: false,
  signOutUser: async () => {},
  verifyPhoneCode: async () => {},
});

export function AuthProvider({ children }: { children: ReactNode }) {
  const [user, setUser] = useState<FirebaseUser | null>(null);
  const [userData, setUserData] = useState<UserData | null>(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, async (firebaseUser) => {
      setUser(firebaseUser);

      if (firebaseUser) {
        try {
          const userDoc = await getDoc(doc(db, 'users', firebaseUser.uid));
          if (userDoc.exists()) {
            const data = userDoc.data();
            setUserData({
              id: firebaseUser.uid,
              phoneNumber: data.phoneNumber || firebaseUser.phoneNumber || '',
              displayName: data.displayName || firebaseUser.displayName || null,
              photoURL: data.photoURL || firebaseUser.photoURL || null,
              createdAt: data.createdAt?.toDate() || new Date(),
              isAdmin: data.isAdmin || false,
            });
          } else {
            await setDoc(doc(db, 'users', firebaseUser.uid), {
              phoneNumber: firebaseUser.phoneNumber || '',
              displayName: firebaseUser.displayName || null,
              photoURL: firebaseUser.photoURL || null,
              createdAt: new Date(),
              linkedAccounts: [],
              isAnonymous: false,
            });
            setUserData({
              id: firebaseUser.uid,
              phoneNumber: firebaseUser.phoneNumber || '',
              displayName: null,
              photoURL: null,
              createdAt: new Date(),
              isAdmin: false,
            });
          }
        } catch (error) {
          console.error('Error fetching user data:', error);
        }
      } else {
        setUserData(null);
      }

      setLoading(false);
    });

    return () => unsubscribe();
  }, []);

  const signOutUser = async () => {
    await signOut(auth);
    setUser(null);
    setUserData(null);
  };

  const verifyPhoneCode = async (verificationId: string, code: string) => {
    const credential = PhoneAuthProvider.credential(verificationId, code);
    await signInWithCredential(auth, credential);
  };

  return (
    <AuthContext.Provider
      value={{ user, userData, loading, isAdmin: userData?.isAdmin || false, signOutUser, verifyPhoneCode }}
    >
      {children}
    </AuthContext.Provider>
  );
}

export const useAuth = () => useContext(AuthContext);
