package com.example.pap_findu;

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Base64;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import com.bumptech.glide.Glide;
import com.example.pap_findu.models.User;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.io.ByteArrayOutputStream;

public class EditProfileActivity extends AppCompatActivity {

    private ImageView editProfileImage;
    private TextView btnChangePhoto;
    private TextInputEditText editName;
    private TextInputEditText editEmail;

    // Botoes
    private MaterialButton btnSaveProfile;
    private MaterialButton btnChangePassword;
    private MaterialButton btnCancelProfile;

    private FirebaseAuth mAuth;
    private DatabaseReference mDatabase;
    private FirebaseUser currentUser;

    // NOVO: Variável para guardar o texto gigante da imagem (Base64) em vez do Uri
    private String base64ImageString = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_profile);

        mAuth = FirebaseAuth.getInstance();
        currentUser = mAuth.getCurrentUser();
        mDatabase = FirebaseDatabase.getInstance().getReference("users");
        // O StorageReference foi removido pois já não precisamos dele!

        if (currentUser == null) {
            finish();
            return;
        }

        initViews();
        loadUserData();
        setupListeners();
    }

    private void initViews() {
        editProfileImage = findViewById(R.id.editProfileImage);
        btnChangePhoto = findViewById(R.id.btnChangePhoto);
        editName = findViewById(R.id.editName);
        editEmail = findViewById(R.id.editEmail);
        btnSaveProfile = findViewById(R.id.btnSaveProfile);
        btnChangePassword = findViewById(R.id.btnChangePassword);
        btnCancelProfile = findViewById(R.id.btnCancelProfile);
    }

    private void loadUserData() {
        mDatabase.child(currentUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                User user = snapshot.getValue(User.class);
                if (user != null) {
                    editName.setText(user.getName());
                    editEmail.setText(user.getEmail());

                    if (user.getProfileImageUrl() != null && !user.getProfileImageUrl().isEmpty()) {
                        try {
                            // Tenta descodificar a imagem de formato Base64 (Texto para Imagem)
                            byte[] decodedString = Base64.decode(user.getProfileImageUrl(), Base64.DEFAULT);
                            Glide.with(EditProfileActivity.this)
                                    .load(decodedString)
                                    .placeholder(R.drawable.logo)
                                    .into(editProfileImage);
                        } catch (Exception e) {
                            // Se der erro (ex: se na DB estiver um link antigo em vez de Base64), tenta carregar normalmente
                            Glide.with(EditProfileActivity.this)
                                    .load(user.getProfileImageUrl())
                                    .placeholder(R.drawable.logo)
                                    .into(editProfileImage);
                        }
                    }
                } else {
                    // Fallback to auth data if DB is empty
                    editName.setText(currentUser.getDisplayName());
                    editEmail.setText(currentUser.getEmail());
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(EditProfileActivity.this, "Erro ao carregar dados", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void setupListeners() {
        // Botão CANCELAR (vermelho) fecha o ecrã
        if (btnCancelProfile != null) {
            btnCancelProfile.setOnClickListener(v -> finish());
        }

        // Lógica de mudar a senha
        btnChangePassword.setOnClickListener(v -> {
            String emailAddress = editEmail.getText().toString().trim();
            if (!emailAddress.isEmpty()) {
                enviarEmailRecuperacao(emailAddress);
            } else {
                Toast.makeText(this, "Erro: Email não encontrado.", Toast.LENGTH_SHORT).show();
            }
        });

        // Image Picker Launcher
        ActivityResultLauncher<Intent> imagePickerLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                        Uri selectedImageUri = result.getData().getData();
                        editProfileImage.setImageURI(selectedImageUri);

                        // NOVO: Faz a conversão mágica da imagem para texto!
                        converterImagemParaTexto(selectedImageUri);
                    }
                });

        btnChangePhoto.setOnClickListener(v -> {
            Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            imagePickerLauncher.launch(intent);
        });

        btnSaveProfile.setOnClickListener(v -> saveProfile());
    }

    // NOVO: Função que pega na foto, encolhe-a e transforma num texto gigante
    private void converterImagemParaTexto(Uri imageUri) {
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
            // Encolher para 300x300 pixeis para não exceder o limite da Realtime Database
            Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, true);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, baos); // Qualidade 70%
            byte[] imageBytes = baos.toByteArray();

            // Guarda a imagem final como uma string
            base64ImageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "Erro ao processar imagem", Toast.LENGTH_SHORT).show();
        }
    }

    // Função para pedir ao Firebase para enviar email de reset
    private void enviarEmailRecuperacao(String email) {
        btnChangePassword.setEnabled(false);
        mAuth.sendPasswordResetEmail(email)
                .addOnCompleteListener(task -> {
                    btnChangePassword.setEnabled(true);
                    if (task.isSuccessful()) {
                        Toast.makeText(EditProfileActivity.this, "Email enviado! Verifique a sua caixa de entrada.", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(EditProfileActivity.this, "Erro ao enviar email.", Toast.LENGTH_SHORT).show();
                    }
                });
    }

    private void saveProfile() {
        String name = editName.getText().toString().trim();
        String email = editEmail.getText().toString().trim();

        if (name.isEmpty() || email.isEmpty()) {
            Toast.makeText(this, "Nome e Email são obrigatórios", Toast.LENGTH_SHORT).show();
            return;
        }

        btnSaveProfile.setEnabled(false);
        btnSaveProfile.setText("A Salvar...");

        // Guardamos o perfil passando a String Base64 (se houver), em vez de fazer upload para o Storage
        saveUserToDb(name, email, base64ImageString);
    }

    private void saveUserToDb(String name, String email, String imageUrlBase64) {
        mDatabase.child(currentUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                User user = snapshot.getValue(User.class);
                if (user == null)
                    user = new User();

                user.setName(name);
                user.setEmail(email);

                // Se houver uma imagem convertida em Base64, guardamos na base de dados
                if (imageUrlBase64 != null) {
                    user.setProfileImageUrl(imageUrlBase64);
                }

                mDatabase.child(currentUser.getUid()).setValue(user)
                        .addOnSuccessListener(aVoid -> {
                            Toast.makeText(EditProfileActivity.this, "Perfil atualizado!", Toast.LENGTH_SHORT).show();
                            finish();
                        })
                        .addOnFailureListener(e -> {
                            Toast.makeText(EditProfileActivity.this, "Erro ao salvar perfil: " + e.getMessage(),
                                    Toast.LENGTH_SHORT).show();
                            btnSaveProfile.setEnabled(true);
                            btnSaveProfile.setText("Salvar Alterações");
                        });
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                btnSaveProfile.setEnabled(true);
            }
        });
    }
}