package com.example.pap_findu.ui.map;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.example.pap_findu.R;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.Timestamp;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.FirebaseFirestore;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class AddChildBottomSheet extends BottomSheetDialogFragment {

    private TextInputEditText etChildName;
    private Button btnSaveChild;
    private FirebaseFirestore db;
    private FirebaseAuth auth;

    // Interface para avisar o MapFragment que o código foi gerado
    public interface OnChildCreatedListener {
        void onCodeGenerated(String code);
    }

    private OnChildCreatedListener listener;

    public void setListener(OnChildCreatedListener listener) {
        this.listener = listener;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        // ⚠️ IMPORTANTE: O nome aqui deve ser igual ao do seu arquivo XML
        // Se o seu arquivo XML se chama 'bottom_add_child.xml', mude abaixo para R.layout.bottom_add_child
        View view = inflater.inflate(R.layout.bottom_sheet_add_child, container, false);

        db = FirebaseFirestore.getInstance();
        auth = FirebaseAuth.getInstance();

        // Vincula os campos do XML
        // Certifique-se que no seu XML os IDs são: @+id/etChildName e @+id/btnSaveChild
        etChildName = view.findViewById(R.id.etChildName);
        btnSaveChild = view.findViewById(R.id.btnSaveChild);

        if (btnSaveChild != null) {
            btnSaveChild.setOnClickListener(v -> saveChildData());
        }

        return view;
    }

    private void saveChildData() {
        if (etChildName == null) return;

        String name = etChildName.getText().toString().trim();

        if (TextUtils.isEmpty(name)) {
            etChildName.setError("Nome é obrigatório");
            return;
        }

        if (auth.getCurrentUser() == null) return;
        String parentId = auth.getCurrentUser().getUid();

        // 1. Gera código aleatório de 6 dígitos
        String code = String.valueOf((int)(Math.random() * 900000) + 100000);
        Timestamp createdAt = new Timestamp(new Date());

        // 2. Prepara os dados do filho
        Map<String, Object> childMap = new HashMap<>();
        childMap.put("name", name);
        childMap.put("parentId", parentId);
        childMap.put("createdAt", createdAt);
        childMap.put("linked", false);
        childMap.put("accessCode", code);

        // 3. Salva na coleção 'children'
        db.collection("children")
                .add(childMap)
                .addOnSuccessListener(documentReference -> {
                    // 4. Se salvou o filho, agora salva o código de login
                    saveLoginCode(parentId, code);
                })
                .addOnFailureListener(e -> {
                    Toast.makeText(getContext(), "Erro ao salvar", Toast.LENGTH_SHORT).show();
                });
    }

    private void saveLoginCode(String parentId, String code) {
        // Código válido por 10 minutos
        Timestamp expiresAt = new Timestamp(new Date(System.currentTimeMillis() + 10 * 60 * 1000));

        Map<String, Object> codeMap = new HashMap<>();
        codeMap.put("parentId", parentId);
        codeMap.put("expiresAt", expiresAt);
        codeMap.put("used", false); // Importante para ser usado apenas uma vez

        db.collection("login_codes").document(code)
                .set(codeMap)
                .addOnSuccessListener(aVoid -> {
                    // Sucesso! Avisa a tela anterior e fecha a janela
                    if (listener != null) {
                        listener.onCodeGenerated(code);
                    }
                    dismiss();
                });
    }
}