# ভেরিয়েশন চুজ করার সময় উইশলিস্ট বাটন স্টেট ফিক্স

## সমস্যা কি ছিল

সিঙ্গেল প্রোডাক্ট পেজে একটা ভেরিয়েবল প্রোডাক্টের কোন একটা ভেরিয়েশন উইশলিস্টে এড করা থাকলে, বাটনে "Already Added" / "In Wishlist" দেখাতো। এরপর যদি ইউজার অন্য একটা ভেরিয়েশন সিলেক্ট করতো, তখনও বাটনে "Already Added" দেখাতো। নতুন ভেরিয়েশন এড করার সুযোগ ছিল না।

## কি চাওয়া হয়েছিল

১. নতুন ভেরিয়েশন সিলেক্ট করলে বাটনে "Add to Wishlist" দেখাবে
২. ইতিমধ্যে এড করা ভেরিয়েশন সিলেক্ট করলে বাটনে "In Wishlist" দেখাবে
৩. কোন ভেরিয়েশন চুজ না থাকলে, কিন্তু কোন ভেরিয়েশন উইশলিস্টে এড থাকলে, "In Wishlist" দেখাবে

## কোন কোন ফাইল পরিবর্তন করা হয়েছে

### ১. `includes/Database/WishlistRepository.php`

**যা যোগ করা হয়েছে:**
- নতুন মেথড `get_variation_ids( $product_id, $user_id, $session_key )` — এই মেথড একটা নির্দিষ্ট প্রোডাক্টের জন্য উইশলিস্টে থাকা সব variation ID গুলো রিটার্ন করে। `user_id` অথবা `session_key` দিয়ে ডাটাবেস কুয়েরি করে।

**কিছু মুছে ফেলা হয়নি।**

### ২. `includes/Frontend/WishlistButton.php` — `render()` মেথড

**যা যোগ করা হয়েছে:**
- ভেরিয়েবল প্রোডাক্টের জন্য `data-wishlisted-variations` নামে একটা নতুন data attribute যোগ করা হয়েছে বাটনে। এই attribute-এ JSON array হিসেবে উইশলিস্টে থাকা variation ID গুলো থাকে। যেমন: `data-wishlisted-variations="[101,102]"`
- `Settings::is_variation_wishlist_enabled()` চেক করে নিশ্চিত করা হয়েছে যে শুধুমাত্র ভেরিয়েশন উইশলিস্ট enable থাকলেই এই data attribute যোগ হবে।
- `repository->get_variation_ids()` কল করে wishlisted variation ID গুলো নিয়ে আসা হচ্ছে।

**কিছু মুছে ফেলা হয়নি।** শুধু `printf()` এর format string-এ `%s` placeholder যোগ করা হয়েছে `data-wishlisted-variations` attribute-এর জন্য।

### ৩. `assets/js/wishlist.js`

**যা পরিবর্তন করা হয়েছে:**

#### `found_variation` event handler (single product page):
- **আগে:** শুধু `data-variation-id` attribute আপডেট করতো, বাটন স্টেট চেঞ্জ করতো না।
- **এখন:** `data-variation-id` আপডেট করার পরে `updateButtonVariationState()` কল করে, যেটা চেক করে সিলেক্ট করা variation ID `data-wishlisted-variations` list-এ আছে কিনা।

#### `reset_data` event handler (single product page):
- **আগে:** শুধু `data-variation-id` কে `'0'` সেট করতো।
- **এখন:** `data-variation-id` রিসেট করার পরে `updateButtonVariationState( $button, 0 )` কল করে, যেটা চেক করে কোন variation wishlisted আছে কিনা।

#### `addToWishlist()` success callback:
- **যা যোগ করা হয়েছে:**
  - `'added'` action-এ: `addToWishlistedVariations( $button, variationId )` কল — নতুন variation ID কে `data-wishlisted-variations` list-এ যোগ করে
  - `'removed'` action-এ: `removeFromWishlistedVariations( $button, variationId )` কল — variation ID কে `data-wishlisted-variations` list থেকে সরিয়ে দেয়

**নতুন ফাংশন যোগ করা হয়েছে:**

1. **`updateButtonVariationState( $button, variationId )`** — মূল লজিক ফাংশন:
   - `data-wishlisted-variations` attribute থেকে JSON parse করে wishlisted variation ID গুলো পায়
   - যদি wishlisted list খালি হয়: বাটনে "Add to Wishlist" দেখায়
   - যদি `variationId === 0` (কোন variation সিলেক্ট নেই) কিন্তু wishlisted list-এ item আছে: "In Wishlist" দেখায়
   - যদি নির্দিষ্ট variation wishlisted list-এ আছে: "In Wishlist" দেখায়
   - যদি নির্দিষ্ট variation wishlisted list-এ নেই: "Add to Wishlist" দেখায়

2. **`setButtonAdded( $button )`** — বাটনকে "In Wishlist" / added state-এ সেট করে

3. **`setButtonNotAdded( $button )`** — বাটনকে "Add to Wishlist" / not added state-এ সেট করে

4. **`addToWishlistedVariations( $button, variationId )`** — `data-wishlisted-variations` JSON array-তে নতুন variation ID যোগ করে

5. **`removeFromWishlistedVariations( $button, variationId )`** — `data-wishlisted-variations` JSON array থেকে variation ID সরিয়ে দেয়

### ৪. `includes/Frontend/Assets.php`

**যা যোগ করা হয়েছে:**
- `i18n` array-তে `'add_to_wishlist'` key যোগ করা হয়েছে — `__( 'Add to Wishlist', 'bizzwishlist' )` value সহ। JavaScript-এ `setButtonNotAdded()` ফাংশন এই string ব্যবহার করে।

**কিছু মুছে ফেলা হয়নি।**

## কোথায় কোথায় চেক করা হয়েছে

- `includes/Database/WishlistRepository.php` — নতুন `get_variation_ids()` মেথড ঠিকমতো SQL query করছে কিনা
- `includes/Frontend/WishlistButton.php` — `render()` মেথডে `data-wishlisted-variations` attribute ঠিকমতো generate হচ্ছে কিনা, এবং শুধুমাত্র variable product ও variation wishlist enabled থাকলেই যোগ হচ্ছে কিনা
- `assets/js/wishlist.js` — `found_variation` ও `reset_data` event handler গুলো ঠিকমতো বাটন স্টেট আপডেট করছে কিনা
- `assets/js/wishlist.js` — `addToWishlist()` AJAX success callback-এ wishlisted variations list ঠিকমতো আপডেট হচ্ছে কিনা
- `includes/Frontend/Assets.php` — নতুন i18n string ঠিকমতো localize হচ্ছে কিনা
- `includes/Ajax/WishlistAjax.php` — এটায় কোন পরিবর্তন দরকার ছিল না, কারণ AJAX handler আগে থেকেই `variation_id` ঠিকমতো handle করে
- সব কোড ফাইলে বাংলা ভাষা নেই তা নিশ্চিত করা হয়েছে

## কিভাবে কাজ করে (সংক্ষেপে)

```
১. PHP: বাটন রেন্ডারের সময় data-wishlisted-variations="[101,102]" attribute যোগ হয়
২. JS: ইউজার variation সিলেক্ট করলে found_variation event fire হয়
৩. JS: updateButtonVariationState() চেক করে সিলেক্ট করা variation_id wishlisted list-এ আছে কিনা
৪. JS: আছে = "In Wishlist" দেখায়, নেই = "Add to Wishlist" দেখায়
৫. JS: AJAX toggle-এর পর wishlisted list update হয় (add/remove)
```
