package com.example.myapplication;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MainActivity extends AppCompatActivity {

    private TextView tvWelcomeUser;
    private TextView btnQuickLogout;
    private EditText etSearch;
    private ListView listViewRecipes;
    private LinearLayout llEmptyState;
    private DatabaseHelper db;

    // Alt Navigasyon Butonları
    private View btnNavAdd, btnNavUsers, btnNavFavs, btnNavProfile;

    // Veri listeleri
    private ArrayList<Integer> ids = new ArrayList<>();
    private ArrayList<String> adlar = new ArrayList<>();
    private ArrayList<String> mallar = new ArrayList<>();
    private ArrayList<String> yaplar = new ArrayList<>();
    private ArrayList<String> kategoriler = new ArrayList<>();
    private ArrayList<String> resimler = new ArrayList<>();
    private ArrayList<Integer> ekleyenIds = new ArrayList<>();
    private ArrayList<String> ekleyenAdlar = new ArrayList<>();
    private ArrayList<Integer> favoriler = new ArrayList<>();

    private CustomAdapter adapter;
    private ExecutorService executorService = Executors.newFixedThreadPool(4);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Oturum kontrolü
        SharedPreferences pref = getSharedPreferences("UserSession", Context.MODE_PRIVATE);
        if (!pref.contains("userId")) {
            // Giriş yapılmamış, giriş sayfasına yönlendir
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
            return;
        }

        setContentView(R.layout.activity_main);

        db = new DatabaseHelper(this);

        // Arayüz elemanlarını bağla
        tvWelcomeUser = findViewById(R.id.tvWelcomeUser);
        btnQuickLogout = findViewById(R.id.btnQuickLogout);
        etSearch = findViewById(R.id.etSearch);
        listViewRecipes = findViewById(R.id.listViewRecipes);
        llEmptyState = findViewById(R.id.llEmptyState);

        // Alt Navigasyon
        btnNavAdd = findViewById(R.id.btnNavAdd);
        btnNavUsers = findViewById(R.id.btnNavUsers);
        btnNavFavs = findViewById(R.id.btnNavFavs);
        btnNavProfile = findViewById(R.id.btnNavProfile);

        // Kullanıcı adını ekrana yazdır
        String userName = pref.getString("userName", "Şef");
        tvWelcomeUser.setText("Merhaba " + userName + "! 🍳");

        // Adaptör kurulumu
        adapter = new CustomAdapter();
        listViewRecipes.setAdapter(adapter);

        // Tarif verilerini yükle
        verileriYukle("");

        // Arama çubuğu takibi
        etSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // Arama metnine göre verileri filtrele
                verileriYukle(s.toString().trim());
            }

            @Override
            public void afterTextChanged(Editable s) {}
        });

        // Çıkış yap butonu
        btnQuickLogout.setOnClickListener(v -> {
            SharedPreferences.Editor editor = pref.edit();
            editor.clear();
            editor.apply();

            Toast.makeText(MainActivity.this, "Çıkış yapıldı!", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        });

        // Navigasyon tıklama olayları
        btnNavAdd.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, MainActivity2.class);
            startActivity(intent);
        });

        btnNavUsers.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, UsersActivity.class);
            startActivity(intent);
        });

        btnNavFavs.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, MainActivity5.class);
            startActivity(intent);
        });

        btnNavProfile.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
            startActivity(intent);
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Sayfa tekrar aktif olduğunda (örn. tarif eklendikten sonra) listeyi yenile
        if (etSearch != null) {
            verileriYukle(etSearch.getText().toString().trim());
        }
    }

    /**
     * Veritabanından tarifleri çeker ve listeye yerleştirir.
     * @param query arama sorgusu (boş ise tümünü getirir)
     */
    private void verileriYukle(String query) {
        ids.clear();
        adlar.clear();
        mallar.clear();
        yaplar.clear();
        kategoriler.clear();
        resimler.clear();
        ekleyenIds.clear();
        ekleyenAdlar.clear();
        favoriler.clear();

        Cursor c;
        if (query == null || query.isEmpty()) {
            c = db.tumVeriler();
        } else {
            c = db.searchRecipes(query);
        }

        if (c != null) {
            while (c.moveToNext()) {
                // id (0), ad (1), malzeme (2), yapilis (3), kategori (4), resim_url (5), ekleyen_id (6), ekleyen_adi (7), favori (8)
                ids.add(c.getInt(0));
                adlar.add(c.getString(1));
                mallar.add(c.getString(2));
                yaplar.add(c.getString(3));
                kategoriler.add(c.getString(4));
                resimler.add(c.getString(5));
                ekleyenIds.add(c.getInt(6));
                ekleyenAdlar.add(c.getString(7));
                favoriler.add(c.getInt(8));
            }
            c.close();
        }

        // Boş durum kontrolü
        if (adlar.isEmpty()) {
            llEmptyState.setVisibility(View.VISIBLE);
            listViewRecipes.setVisibility(View.GONE);
        } else {
            llEmptyState.setVisibility(View.GONE);
            listViewRecipes.setVisibility(View.VISIBLE);
        }

        adapter.notifyDataSetChanged();
    }

    /**
     * Kategori adına uygun emoji döndürür.
     */
    public static String getEmojiForCategory(String category) {
        if (category == null) return "🍽️";
        switch (category) {
            case "Çorba": return "🥣";
            case "Ana Yemek":
            case "Kebap": return "🥩";
            case "Pizzalar":
            case "Fast Food": return "🍕";
            case "Salata": return "🥗";
            case "Tatlı": return "🍰";
            case "Burger": return "🍔";
            case "Makarna": return "🍝";
            case "Kahvaltı": return "🍳";
            default: return "🍽️";
        }
    }

    /**
     * Resim URL'sini arka planda yükleyen ve ImageView'a basan metot.
     */
    private void loadRemoteImage(String urlString, ImageView imageView) {
        if (urlString == null || urlString.trim().isEmpty()) {
            imageView.setVisibility(View.GONE);
            return;
        }

        // Image tag'ine URL'yi yazarak hatalı yüklemeleri önlüyoruz (hızlı kaydırma durumunda)
        imageView.setTag(urlString);

        executorService.execute(() -> {
            try {
                URL url = new URL(urlString);
                InputStream is = url.openStream();
                Bitmap bmp = BitmapFactory.decodeStream(is);
                new Handler(Looper.getMainLooper()).post(() -> {
                    if (urlString.equals(imageView.getTag())) {
                        if (bmp != null) {
                            imageView.setImageBitmap(bmp);
                            imageView.setVisibility(View.VISIBLE);
                        } else {
                            imageView.setVisibility(View.GONE);
                        }
                    }
                });
            } catch (Exception e) {
                new Handler(Looper.getMainLooper()).post(() -> {
                    if (urlString.equals(imageView.getTag())) {
                        imageView.setVisibility(View.GONE);
                    }
                });
            }
        });
    }

    /**
     * ListView için özel adaptör.
     */
    class CustomAdapter extends BaseAdapter {

        @Override public int getCount() { return adlar.size(); }
        @Override public Object getItem(int i) { return null; }
        @Override public long getItemId(int i) { return 0; }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.list_item_layout, null);
            }

            TextView txtAd = convertView.findViewById(R.id.txtYemekAdi);
            TextView txtKategori = convertView.findViewById(R.id.txtYemekKategori);
            TextView txtEkleyen = convertView.findViewById(R.id.txtYemekEkleyen);
            TextView txtEmoji = convertView.findViewById(R.id.txtCategoryEmoji);
            ImageView imgPoster = convertView.findViewById(R.id.imgRecipePoster);
            TextView btnFav = convertView.findViewById(R.id.btnFavoriEkle);

            // Verileri ata
            txtAd.setText(adlar.get(position));
            
            String category = kategoriler.get(position);
            txtKategori.setText("Kategori: " + category);
            
            String ekleyen = ekleyenAdlar.get(position);
            txtEkleyen.setText("Şef: " + (ekleyen == null ? "Bilinmeyen Şef" : ekleyen));

            // Kategori Emojisini ayarla
            txtEmoji.setText(getEmojiForCategory(category));

            // Resim URL yükleme
            String imageUrl = resimler.get(position);
            imgPoster.setVisibility(View.GONE); // Varsayılan gizli
            if (imageUrl != null && !imageUrl.trim().isEmpty()) {
                loadRemoteImage(imageUrl, imgPoster);
            }

            // Favori durumu gösterimi (❤️ / 🤍)
            int isFav = favoriler.get(position);
            if (isFav == 1) {
                btnFav.setText("❤️");
            } else {
                btnFav.setText("🤍");
            }

            // Favori butonu tıklama
            btnFav.setOnClickListener(v -> {
                int newFavStatus = isFav == 1 ? 0 : 1;
                db.favoriGuncelle(ids.get(position), newFavStatus);
                
                String message = newFavStatus == 1 ? " favorilere eklendi! ❤️" : " favorilerden çıkarıldı! 🤍";
                Toast.makeText(MainActivity.this, adlar.get(position) + message, Toast.LENGTH_SHORT).show();
                
                // Listeyi yenile
                verileriYukle(etSearch.getText().toString().trim());
            });

            // Kartın kendisine tıklanma (Detay Sayfası)
            convertView.setOnClickListener(v -> {
                Intent intent = new Intent(MainActivity.this, MainActivity4.class);
                intent.putExtra("pId", ids.get(position));
                intent.putExtra("pAd", adlar.get(position));
                intent.putExtra("pMal", mallar.get(position));
                intent.putExtra("pYap", yaplar.get(position));
                intent.putExtra("pKategori", category);
                intent.putExtra("pResimUrl", imageUrl);
                intent.putExtra("pEkleyen", ekleyen);
                startActivity(intent);
            });

            return convertView;
        }
    }
}