Showing
1 changed file
with
116 additions
and
30 deletions
| ... | @@ -202,8 +202,7 @@ import UIKit | ... | @@ -202,8 +202,7 @@ import UIKit |
| 202 | self.merchantCategories = categories | 202 | self.merchantCategories = categories |
| 203 | print("✅ [MyRewardsViewController] Loaded \(categories.count) merchant categories") | 203 | print("✅ [MyRewardsViewController] Loaded \(categories.count) merchant categories") |
| 204 | 204 | ||
| 205 | - // TODO: Implement category-based filtering for coupon sets sections | 205 | + // Create coupon sets sections with category-based filtering |
| 206 | - // For now, create the standard coupon sets section | ||
| 207 | self.createCouponSetsSection() | 206 | self.createCouponSetsSection() |
| 208 | 207 | ||
| 209 | } failureCallback: { [weak self] errorCode in | 208 | } failureCallback: { [weak self] errorCode in |
| ... | @@ -214,44 +213,131 @@ import UIKit | ... | @@ -214,44 +213,131 @@ import UIKit |
| 214 | } | 213 | } |
| 215 | 214 | ||
| 216 | private func createCouponSetsSection() { | 215 | private func createCouponSetsSection() { |
| 217 | - // TODO: IMPLEMENT CATEGORY-BASED FILTERING | 216 | + print("🔍 [MyRewardsViewController] Starting coupon filtering:") |
| 218 | - // | 217 | + print(" - Coupon Sets: \(couponSets.count)") |
| 219 | - // Current logic: Creates one section with all coupon sets | 218 | + print(" - Merchants: \(merchants.count)") |
| 220 | - // | 219 | + print(" - Categories: \(merchantCategories.count)") |
| 221 | - // Future enhancement: Filter coupon sets into different sections based on categories | ||
| 222 | - // Logic: | ||
| 223 | - // 1. For each couponset, get its merchant_uuid | ||
| 224 | - // 2. Find the merchant with that merchant_uuid in self.merchants | ||
| 225 | - // 3. Get the merchant's category_uuid | ||
| 226 | - // 4. Find the category with that category_uuid in self.merchantCategories | ||
| 227 | - // 5. Group coupon sets by category | ||
| 228 | - // 6. Create separate sections for each category | ||
| 229 | - // | ||
| 230 | - // Example structure after filtering: | ||
| 231 | - // - Section: "Εκπαίδευση" (Education) - coupon sets from education merchants | ||
| 232 | - // - Section: "Ψυχαγωγία" (Entertainment) - coupon sets from entertainment merchants | ||
| 233 | - // - etc. | ||
| 234 | - // | ||
| 235 | - // Implementation steps: | ||
| 236 | - // 1. Create a dictionary to group coupon sets by category: [String: [CouponSetItemModel]] | ||
| 237 | - // 2. Iterate through self.couponSets | ||
| 238 | - // 3. For each coupon set, find its merchant and category | ||
| 239 | - // 4. Add coupon set to the appropriate category group | ||
| 240 | - // 5. Create a SectionModel for each category group | ||
| 241 | - // 6. Sort sections by category name or priority | ||
| 242 | 220 | ||
| 243 | - // Current implementation (temporary): | 221 | + // Check if we have all required data for filtering |
| 222 | + guard !couponSets.isEmpty, !merchants.isEmpty, !merchantCategories.isEmpty else { | ||
| 223 | + print("⚠️ [MyRewardsViewController] Missing data for filtering - using fallback single section") | ||
| 224 | + print(" - Coupon Sets Empty: \(couponSets.isEmpty)") | ||
| 225 | + print(" - Merchants Empty: \(merchants.isEmpty)") | ||
| 226 | + print(" - Categories Empty: \(merchantCategories.isEmpty)") | ||
| 227 | + | ||
| 228 | + // Fallback: Create single section with all coupon sets | ||
| 229 | + createSingleCouponSetsSection() | ||
| 230 | + return | ||
| 231 | + } | ||
| 232 | + | ||
| 233 | + // Group coupon sets by merchant category | ||
| 234 | + var categorySections: [SectionModel] = [] | ||
| 235 | + var processedCouponSets: Set<String> = [] // Track processed coupon sets to avoid duplicates | ||
| 236 | + | ||
| 237 | + print("🔄 [MyRewardsViewController] Processing categories for filtering...") | ||
| 238 | + | ||
| 239 | + for category in merchantCategories { | ||
| 240 | + // Find merchants in this category | ||
| 241 | + let categoryMerchants = merchants.filter { merchant in | ||
| 242 | + merchant._category_uuid == category._uuid | ||
| 243 | + } | ||
| 244 | + | ||
| 245 | + print(" - Category '\(category.displayName)' has \(categoryMerchants.count) merchants") | ||
| 246 | + | ||
| 247 | + // Find coupon sets from merchants in this category | ||
| 248 | + let categoryCouponSets = couponSets.filter { couponSet in | ||
| 249 | + // Skip if already processed (avoid duplicates) | ||
| 250 | + guard !processedCouponSets.contains(couponSet._uuid) else { return false } | ||
| 251 | + | ||
| 252 | + // Check if this coupon set belongs to any merchant in this category | ||
| 253 | + let belongsToCategory = categoryMerchants.contains { merchant in | ||
| 254 | + merchant._uuid == couponSet._merchant_uuid | ||
| 255 | + } | ||
| 256 | + | ||
| 257 | + if belongsToCategory { | ||
| 258 | + processedCouponSets.insert(couponSet._uuid) | ||
| 259 | + } | ||
| 260 | + | ||
| 261 | + return belongsToCategory | ||
| 262 | + } | ||
| 263 | + | ||
| 264 | + print(" - Category '\(category.displayName)' has \(categoryCouponSets.count) coupon sets") | ||
| 265 | + | ||
| 266 | + // Create section if we have coupon sets for this category | ||
| 267 | + if !categoryCouponSets.isEmpty { | ||
| 268 | + let section = SectionModel( | ||
| 269 | + sectionType: .myRewardsHorizontalCouponsets, | ||
| 270 | + title: category.displayName, | ||
| 271 | + items: categoryCouponSets, | ||
| 272 | + itemType: .couponSets | ||
| 273 | + ) | ||
| 274 | + categorySections.append(section) | ||
| 275 | + | ||
| 276 | + print(" ✅ Created section for '\(category.displayName)' with \(categoryCouponSets.count) items") | ||
| 277 | + } | ||
| 278 | + } | ||
| 279 | + | ||
| 280 | + // Handle any remaining unmatched coupon sets | ||
| 281 | + let unmatchedCouponSets = couponSets.filter { couponSet in | ||
| 282 | + !processedCouponSets.contains(couponSet._uuid) | ||
| 283 | + } | ||
| 284 | + | ||
| 285 | + if !unmatchedCouponSets.isEmpty { | ||
| 286 | + print(" ⚠️ Found \(unmatchedCouponSets.count) unmatched coupon sets - adding to 'Άλλες Προσφορές' section") | ||
| 287 | + | ||
| 288 | + let unmatchedSection = SectionModel( | ||
| 289 | + sectionType: .myRewardsHorizontalCouponsets, | ||
| 290 | + title: "Άλλες Προσφορές", // "Other Offers" | ||
| 291 | + items: unmatchedCouponSets, | ||
| 292 | + itemType: .couponSets | ||
| 293 | + ) | ||
| 294 | + categorySections.append(unmatchedSection) | ||
| 295 | + } | ||
| 296 | + | ||
| 297 | + // Sort sections by title for consistent ordering | ||
| 298 | + categorySections.sort { section1, section2 in | ||
| 299 | + let title1 = section1.title ?? "" | ||
| 300 | + let title2 = section2.title ?? "" | ||
| 301 | + | ||
| 302 | + // Put "Άλλες Προσφορές" at the end | ||
| 303 | + if title1 == "Άλλες Προσφορές" { return false } | ||
| 304 | + if title2 == "Άλλες Προσφορές" { return true } | ||
| 305 | + | ||
| 306 | + return title1.localizedCaseInsensitiveCompare(title2) == .orderedAscending | ||
| 307 | + } | ||
| 308 | + | ||
| 309 | + print("✅ [MyRewardsViewController] Created \(categorySections.count) category sections:") | ||
| 310 | + for section in categorySections { | ||
| 311 | + print(" - '\(section.title ?? "Unknown")': \(section.itemCount) coupon sets") | ||
| 312 | + } | ||
| 313 | + | ||
| 314 | + // Add category sections to main sections array | ||
| 315 | + self.sections.append(contentsOf: categorySections) | ||
| 316 | + | ||
| 317 | + // Reload table view with new sections | ||
| 318 | + DispatchQueue.main.async { | ||
| 319 | + self.tableView.reloadData() | ||
| 320 | + } | ||
| 321 | + } | ||
| 322 | + | ||
| 323 | + private func createSingleCouponSetsSection() { | ||
| 324 | + print("📦 [MyRewardsViewController] Creating single fallback coupon sets section") | ||
| 325 | + | ||
| 326 | + // Fallback: Single section with all coupon sets | ||
| 244 | if !self.couponSets.isEmpty { | 327 | if !self.couponSets.isEmpty { |
| 245 | let couponSetsSection = SectionModel( | 328 | let couponSetsSection = SectionModel( |
| 246 | sectionType: .myRewardsHorizontalCouponsets, | 329 | sectionType: .myRewardsHorizontalCouponsets, |
| 247 | - title: "Προσφορές", | 330 | + title: "Προσφορές", // "Offers" |
| 248 | items: self.couponSets, | 331 | items: self.couponSets, |
| 249 | itemType: .couponSets | 332 | itemType: .couponSets |
| 250 | ) | 333 | ) |
| 251 | self.sections.append(couponSetsSection) | 334 | self.sections.append(couponSetsSection) |
| 335 | + | ||
| 336 | + print("✅ [MyRewardsViewController] Created fallback section with \(self.couponSets.count) coupon sets") | ||
| 337 | + } else { | ||
| 338 | + print("⚠️ [MyRewardsViewController] No coupon sets available - no section created") | ||
| 252 | } | 339 | } |
| 253 | 340 | ||
| 254 | - // Reload table view with new sections | ||
| 255 | DispatchQueue.main.async { | 341 | DispatchQueue.main.async { |
| 256 | self.tableView.reloadData() | 342 | self.tableView.reloadData() |
| 257 | } | 343 | } | ... | ... |
-
Please register or login to post a comment