package com.fluxup.app;

import android.content.Context;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthException;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.FirebaseFirestore;
import java.util.HashMap;
import java.util.Map;

public class UsuariosService {


    private static AuthManager getAuthManager() {
        return AuthManager.getInstance();
    }

    private static FirebaseFirestore getFirestore() {
        return FirebaseFirestore.getInstance();
    }

    public static void login(Context context, String email, String password, ServiceCallback<Usuario> callback) {
        android.util.Log.d("FLUXUP_SERVICE", "A tentar iniciar sessão para: " + email);
        getAuthManager().loginUtilizador(email, password, new AuthManager.AuthCallback() {
            @Override
            public void onSuccess(FirebaseUser user) {
                if (user != null) {
                    android.util.Log.d("FLUXUP_SERVICE", "Auth bem-sucedido para: " + email);
                    Usuario defaultUsuario = new Usuario(user.getUid(), "", user.getEmail(), "", "");
                    defaultUsuario.id = user.getUid();
                        
                    getFirestore().collection("users").document(user.getUid()).get()
                        .addOnSuccessListener(documentSnapshot -> {
                            android.util.Log.d("FLUXUP_SERVICE", "Dados recuperados do Firestore com sucesso.");
                            Usuario usuario = documentSnapshot.toObject(Usuario.class);
                            if (usuario != null) {
                                callback.onSuccess(usuario);
                            } else {
                                android.util.Log.w("FLUXUP_SERVICE", "Documento do utilizador não encontrado no Firestore.");
                                callback.onSuccess(defaultUsuario);
                            }
                        })
                        .addOnFailureListener(e -> {
                            android.util.Log.e("FLUXUP_SERVICE", "Erro ao carregar do Firestore: " + e.getMessage());
                            callback.onSuccess(defaultUsuario);
                        });
                }
            }
            @Override
            public void onError(String errorMessage) {
                android.util.Log.e("FLUXUP_SERVICE", "Falha no Auth: " + errorMessage);
                callback.onError(errorMessage);
            }
        });
    }

    public static void registar(Context context, Usuario usuario, ServiceCallback<Usuario> callback) {
        android.util.Log.d("FLUXUP_SERVICE", "A tentar registar utilizador: " + usuario.email);
        getAuthManager().registrarUtilizador(usuario.email, usuario.palavra_passe, new AuthManager.AuthCallback() {
            @Override
            public void onSuccess(FirebaseUser firebaseUser) {
                if (firebaseUser != null) {
                    android.util.Log.d("FLUXUP_SERVICE", "Utilizador criado no Auth com sucesso: " + usuario.email);
                    String uid = firebaseUser.getUid();
                        usuario.id_usuario = uid;
                        usuario.id = uid;
                        
                        String tempPass = usuario.palavra_passe;
                        usuario.palavra_passe = null;
                        
                        android.util.Log.d("FLUXUP_SERVICE", "A guardar utilizador no Firestore (Coleção: users, ID: " + uid + ")...");
                    getFirestore().collection("users").document(uid).set(usuario)
                        .addOnSuccessListener(aVoid -> {
                            android.util.Log.d("FLUXUP_SERVICE", "Utilizador guardado no Firestore com sucesso.");
                            usuario.palavra_passe = tempPass;
                            callback.onSuccess(usuario);
                        })
                        .addOnFailureListener(e -> {
                            android.util.Log.e("FLUXUP_SERVICE", "ERRO NO FIRESTORE: " + e.getMessage());
                            callback.onError("Erro ao guardar na base de dados: " + e.getMessage());
                        });
                }
            }
            @Override
            public void onError(String errorMessage) {
                android.util.Log.e("FLUXUP_SERVICE", "Falha ao criar conta no Auth: " + errorMessage);
                callback.onError(errorMessage);
            }
        });
    }

    public static void recuperarPalavraPasse(Context context, String email, ServiceCallback<Void> callback) {
        FirebaseAuth.getInstance().sendPasswordResetEmail(email)
            .addOnCompleteListener(task -> {
                if (task.isSuccessful()) {
                    callback.onSuccess(null);
                } else {
                    callback.onError(task.getException() != null ? task.getException().getMessage() : "Erro ao enviar email");
                }
            });
    }

    public interface ServiceCallback<T> {
        void onSuccess(T data);
        void onError(String error);
    }
}
