package com.example.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

    // Veritabanı adı ve sürümü
    // Sürümü 2 yaparak eski şemayı otomatik sıfırlıyoruz.
    private static final String DATABASE_NAME = "YemekRehberi.db";
    private static final int DATABASE_VERSION = 2;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Kullanıcılar tablosu
        db.execSQL("CREATE TABLE users (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "name TEXT, " +
                "email TEXT UNIQUE, " +
                "password TEXT)");

        // Yemek tarifleri tablosu
        db.execSQL("CREATE TABLE tarifler (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "ad TEXT, " +
                "malzeme TEXT, " +
                "yapilis TEXT, " +
                "kategori TEXT, " +
                "resim_url TEXT, " +
                "ekleyen_id INTEGER, " +
                "ekleyen_adi TEXT, " +
                "favori INTEGER DEFAULT 0)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS tarifler");
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }

    // ── KULLANICI İŞLEMLERİ ───────────────────────────────────────────

    /**
     * Yeni kullanıcı kaydeder. E-posta adresi benzersiz olmalıdır.
     */
    public boolean registerUser(String name, String email, String password) {
        SQLiteDatabase db = this.getWritableDatabase();
        
        // E-postanın zaten kayıtlı olup olmadığını kontrol et
        Cursor cursor = db.rawQuery("SELECT id FROM users WHERE email = ?", new String[]{email});
        if (cursor != null && cursor.getCount() > 0) {
            cursor.close();
            return false; // Zaten kayıtlı
        }
        if (cursor != null) cursor.close();

        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("email", email);
        values.put("password", password);

        long result = db.insert("users", null, values);
        return result != -1;
    }

    /**
     * Kullanıcı girişi kontrolü.
     */
    public boolean checkUser(String email, String password) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT id FROM users WHERE email = ? AND password = ?", new String[]{email, password});
        boolean exists = (cursor != null && cursor.getCount() > 0);
        if (cursor != null) cursor.close();
        return exists;
    }

    /**
     * E-postaya göre kullanıcı bilgilerini döndürür.
     */
    public Cursor getUser(String email) {
        SQLiteDatabase db = this.getReadableDatabase();
        return db.rawQuery("SELECT id, name, email FROM users WHERE email = ?", new String[]{email});
    }

    /**
     * Kullanıcıyı siler (Tüm verileri silmeden önce çağrılır)
     */
    public boolean deleteUser(int userId) {
        SQLiteDatabase db = this.getWritableDatabase();
        int affected = db.delete("users", "id = ?", new String[]{String.valueOf(userId)});
        return affected > 0;
    }

    /**
     * Tüm kullanıcıları ve paylaştıkları tarif sayılarını döndürür.
     */
    public Cursor getAllUsers() {
        SQLiteDatabase db = this.getReadableDatabase();
        return db.rawQuery("SELECT u.id, u.name, u.email, COUNT(t.id) as tarif_sayisi " +
                "FROM users u " +
                "LEFT JOIN tarifler t ON u.id = t.ekleyen_id " +
                "GROUP BY u.id", null);
    }

    // ── TARİF İŞLEMLERİ ───────────────────────────────────────────────

    /**
     * Yeni tarif ekler.
     */
    public void kaydet(String ad, String mal, String yap, String kategori, String resimUrl, int ekleyenId, String ekleyenAdi) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues v = new ContentValues();
        v.put("ad", ad);
        v.put("malzeme", mal);
        v.put("yapilis", yap);
        v.put("kategori", kategori);
        v.put("resim_url", resimUrl);
        v.put("ekleyen_id", ekleyenId);
        v.put("ekleyen_adi", ekleyenAdi);
        v.put("favori", 0);
        db.insert("tarifler", null, v);
    }

    /**
     * Tüm tarifleri çeker.
     */
    public Cursor tumVeriler() {
        SQLiteDatabase db = this.getReadableDatabase();
        return db.rawQuery("SELECT * FROM tarifler ORDER BY id DESC", null);
    }

    /**
     * Belirli bir kullanıcının eklediği tarifleri siler.
     */
    public void deleteUserRecipes(int userId) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete("tarifler", "ekleyen_id = ?", new String[]{String.valueOf(userId)});
    }

    /**
     * Tarif adına veya malzemelerine göre arama yapar.
     */
    public Cursor searchRecipes(String query) {
        SQLiteDatabase db = this.getReadableDatabase();
        String likeQuery = "%" + query + "%";
        return db.rawQuery("SELECT * FROM tarifler WHERE ad LIKE ? OR malzeme LIKE ? OR kategori LIKE ? ORDER BY id DESC",
                new String[]{likeQuery, likeQuery, likeQuery});
    }

    /**
     * Sadece favori olan tarifleri çeker.
     */
    public Cursor favorileriGetir() {
        SQLiteDatabase db = this.getReadableDatabase();
        return db.rawQuery("SELECT * FROM tarifler WHERE favori = 1 ORDER BY id DESC", null);
    }

    /**
     * Tarifin favori durumunu günceller (ID'ye göre).
     */
    public void favoriGuncelle(int id, int durum) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues v = new ContentValues();
        v.put("favori", durum);
        db.update("tarifler", v, "id=?", new String[]{String.valueOf(id)});
    }
}