001package ai.lilystyle.analytics_android.data;
002
003import android.util.Log;
004
005import org.json.JSONArray;
006import org.json.JSONException;
007import org.json.JSONObject;
008
009
010/**
011 * DataFactory is a helper class for creating typical data structures for tracking.
012 *
013 * Please refer to the main document to get the meaning of each field
014 *
015 * Usage example:
016 * <pre>
017 * {@code
018 * JSONObject data = DataFactory.createProductListView()
019 *     .setProductCategory("Skirts")
020 *     .setSortType("Low To High")
021 *     .addFilterBy(DataFactory.createFilterBy()
022 *             .setFilterCategory("Cut")
023 *             .addFilterValues("Skinny Leg"))
024 *     .setRecommendationRequestID("fsdkjk23432")
025 *     .addProduct(DataFactory.createProduct()
026 *             .setSkuId("45790432")
027 *             .setSize("xs")
028 *             .setPrice(24)
029 *             .setSalePrice(20.99)
030 *             .setCurrencyCode("USD")
031 *             .setPosition(1)
032 *             .setBadgeName("Favorites")
033 *             .setFavoriteCount(10))
034 *     .addProduct(DataFactory.createProduct()
035 *             .setSkuId("9848545")
036 *             .setSize("xs")
037 *             .setPrice(24)
038 *             .setSalePrice(20.99)
039 *             .setCurrencyCode("USD")
040 *             .setPosition(2)
041 *             .setBadgeName("New Arrival")
042 *             .setFavoriteCount(10))
043 *     .set("custom_field", "MY_VALUE")
044 *     .build();
045 *
046 * lilyAi.track(data, listener);
047 * }
048 * </pre>
049 */
050public class DataFactory {
051    private DataFactory() {}
052
053    public static BaseMessageBuilder createBaseMessage() {
054        return new BaseMessageBuilder();
055    }
056
057    public static FilterByBuilder createFilterBy() {
058        return new FilterByBuilder();
059    }
060
061    public static ProductBuilder createProduct() {
062        return new ProductBuilder();
063    }
064
065    public static ProductListViewBuilder createProductListView() {
066        return new ProductListViewBuilder();
067    }
068
069    public static ProductSearchBuilder createProductSearch() {
070        return new ProductSearchBuilder();
071    }
072
073    public static NotifyBuilder createNotify() {
074        return new NotifyBuilder();
075    }
076
077    public static SaveSearchClickBuilder createSaveSearchClick() {
078        return new SaveSearchClickBuilder();
079    }
080
081    public static SavedSearchUpdateBuilder createSavedSearchUpdate() {
082        return new SavedSearchUpdateBuilder();
083    }
084
085    public static ProductClickBuilder createProductClick() {
086        return new ProductClickBuilder();
087    }
088
089    public static ProductViewBuilder createProductView() {
090        return new ProductViewBuilder();
091    }
092
093    public static AddToCartBuilder createAddToCart() {
094        return new AddToCartBuilder();
095    }
096
097    public static RemoveFromCartBuilder createRemoveFromCart() {
098        return new RemoveFromCartBuilder();
099    }
100
101    public static CheckoutInitiateBuilder createCheckoutInitiate() {
102        return new CheckoutInitiateBuilder();
103    }
104
105    public static OrderCompleteBuilder createOrderComplete() {
106        return new OrderCompleteBuilder();
107    }
108
109    public static ProductAddToWishlistBuilder createProductAddToWishlist() {
110        return new ProductAddToWishlistBuilder();
111    }
112
113    public static EmailSignUpBuilder createEmailSignUp() {
114        return new EmailSignUpBuilder();
115    }
116
117    public static SortSelectBuilder createSortSelect() {
118        return new SortSelectBuilder();
119    }
120
121    public static GetNotifiedClickBuilder createGetNotifiedClick() {
122        return new GetNotifiedClickBuilder();
123    }
124
125    public static SearchDeleteBuilder createSearchDelete() {
126        return new SearchDeleteBuilder();
127    }
128
129    public static StyleIconFollowBuilder createStyleIconFollow() {
130        return new StyleIconFollowBuilder();
131    }
132
133    public static GetRescueBoxClickBuilder createGetRescueBoxClick() {
134        return new GetRescueBoxClickBuilder();
135    }
136
137    public static GetSimilarProductClickBuilder createGetSimilarProductClick() {
138        return new GetSimilarProductClickBuilder();
139    }
140
141    public static AnswerBuilder createAnswer() {
142        return new AnswerBuilder();
143    }
144
145    public static GoodyBoxQuizStepCompletedBuilder createGoodyBoxQuizStepCompleted() {
146        return new GoodyBoxQuizStepCompletedBuilder();
147    }
148
149    public static GetGoodyBoxClickBuilder createGetGoodyBoxClick() {
150        return new GetGoodyBoxClickBuilder();
151    }
152
153
154
155
156    public static class GetGoodyBoxClickBuilder extends BaseMessageBuilder {
157        GetGoodyBoxClickBuilder() {
158            super();
159            set("event", "GetGoodyBoxClick");
160            setHitTimestamp(System.currentTimeMillis());
161        }
162
163        public GetGoodyBoxClickBuilder setBoxID(String gbxid) {
164            return (GetGoodyBoxClickBuilder) set("gbxid", gbxid);
165        }
166    }
167
168    public static class GoodyBoxQuizStepCompletedBuilder extends BaseMessageBuilder {
169        GoodyBoxQuizStepCompletedBuilder() {
170            super();
171            set("event", "GoodyBoxQuizStepCompleted");
172            setHitTimestamp(System.currentTimeMillis());
173        }
174
175        public GoodyBoxQuizStepCompletedBuilder setQuizID(int quid) {
176            return (GoodyBoxQuizStepCompletedBuilder) set("quid", quid);
177        }
178
179        public GoodyBoxQuizStepCompletedBuilder addAnswer(AnswerBuilder answer) {
180            return (GoodyBoxQuizStepCompletedBuilder) addToArray("answers", answer.build());
181        }
182    }
183
184    public static class AnswerBuilder extends BaseMessageBuilder {
185        public AnswerBuilder setOptionID(int optid) {
186            return (AnswerBuilder) set("optid", optid);
187        }
188
189        public AnswerBuilder setOptionScale(int optstr) {
190            return (AnswerBuilder) set("optstr", optstr);
191        }
192
193        public AnswerBuilder setText(String opttxt) {
194            return (AnswerBuilder) set("opttxt", opttxt);
195        }
196    }
197
198    public static class GetSimilarProductClickBuilder extends ProductBuilder {
199        GetSimilarProductClickBuilder() {
200            super();
201            set("event", "GetSimilarProductClick");
202            setHitTimestamp(System.currentTimeMillis());
203        }
204    }
205
206    public static class GetRescueBoxClickBuilder extends BaseMessageBuilder {
207        GetRescueBoxClickBuilder() {
208            super();
209            set("event", "GetRescueBoxClick");
210            setHitTimestamp(System.currentTimeMillis());
211        }
212
213        public GetRescueBoxClickBuilder setBoxID(String rbxid) {
214            return (GetRescueBoxClickBuilder) set("rbxid", rbxid);
215        }
216
217        public GetRescueBoxClickBuilder setQuantity(int qty) {
218            return (GetRescueBoxClickBuilder) set("qty", qty);
219        }
220
221        public GetRescueBoxClickBuilder setPrice(double price) {
222            return (GetRescueBoxClickBuilder) set("pr", price);
223        }
224
225        public GetRescueBoxClickBuilder setCurrencyCode(String cur) {
226            return (GetRescueBoxClickBuilder) set("cur", cur);
227        }
228
229        public GetRescueBoxClickBuilder setSize(String sz) {
230            return (GetRescueBoxClickBuilder) set("sz", sz);
231        }
232    }
233
234    public static class StyleIconFollowBuilder extends BaseMessageBuilder {
235        StyleIconFollowBuilder() {
236            super();
237            set("event", "StyleIconFollow");
238            setHitTimestamp(System.currentTimeMillis());
239        }
240
241        public StyleIconFollowBuilder setStyleIconID(String sicid) {
242            return (StyleIconFollowBuilder) set("sicid", sicid);
243        }
244
245        public StyleIconFollowBuilder setStyleIconName(String sicnm) {
246            return (StyleIconFollowBuilder) set("sicnm", sicnm);
247        }
248
249        public StyleIconFollowBuilder addNotify(NotifyBuilder snotify) {
250            return (StyleIconFollowBuilder) addToArray("snotify", snotify.build());
251        }
252    }
253
254    public static class SearchDeleteBuilder extends BaseMessageBuilder {
255        SearchDeleteBuilder() {
256            super();
257            set("event", "SearchDelete");
258            setHitTimestamp(System.currentTimeMillis());
259        }
260
261        public SearchDeleteBuilder setSearchId(String seid) {
262            return (SearchDeleteBuilder) set("seid", seid);
263        }
264    }
265
266    public static class GetNotifiedClickBuilder extends ProductBuilder {
267        GetNotifiedClickBuilder() {
268            super();
269            set("event", "GetNotifiedClick");
270            setHitTimestamp(System.currentTimeMillis());
271        }
272
273        public GetNotifiedClickBuilder setProductListingName(String linm) {
274            return (GetNotifiedClickBuilder) set("linm", linm);
275        }
276
277        public GetNotifiedClickBuilder setRecommendationRequestID(String rtkn) {
278            return (GetNotifiedClickBuilder) set("rtkn", rtkn);
279        }
280    }
281
282    public static class SortSelectBuilder extends BaseMessageBuilder {
283        SortSelectBuilder() {
284            super();
285            set("event", "SortSelect");
286            setHitTimestamp(System.currentTimeMillis());
287        }
288
289        public SortSelectBuilder setProductCategory(String pcat) {
290            return (SortSelectBuilder) set("pcat", pcat);
291        }
292
293        public SortSelectBuilder setSortType(String sort) {
294            return (SortSelectBuilder) set("sort", sort);
295        }
296    }
297
298    public static class EmailSignUpBuilder extends BaseMessageBuilder {
299        EmailSignUpBuilder() {
300            super();
301            set("event", "EmailSignUp");
302            setHitTimestamp(System.currentTimeMillis());
303        }
304
305        public EmailSignUpBuilder setHashedUserEmail(String uem) {
306            return (EmailSignUpBuilder) set("uem", uem);
307        }
308
309        public EmailSignUpBuilder setUserID(String uid) {
310            return (EmailSignUpBuilder) set("uid", uid);
311        }
312    }
313
314    public static class ProductAddToWishlistBuilder extends ProductBuilder {
315        ProductAddToWishlistBuilder() {
316            super();
317            set("event", "ProductAddToWishlist");
318            setHitTimestamp(System.currentTimeMillis());
319        }
320
321        public ProductAddToWishlistBuilder setWishlistName(String wlist) {
322            return (ProductAddToWishlistBuilder) set("wlist", wlist);
323        }
324
325        public ProductAddToWishlistBuilder setProductListingName(String linm) {
326            return (ProductAddToWishlistBuilder) set("linm", linm);
327        }
328
329        public ProductAddToWishlistBuilder setRecommendationRequestID(String rtkn) {
330            return (ProductAddToWishlistBuilder) set("rtkn", rtkn);
331        }
332    }
333
334    public static class OrderCompleteBuilder extends BaseMessageBuilder {
335        OrderCompleteBuilder() {
336            super();
337            set("event", "OrderComplete");
338            setHitTimestamp(System.currentTimeMillis());
339        }
340
341        public OrderCompleteBuilder setTransactionID(String tnid) {
342            return (OrderCompleteBuilder) set("tnid", tnid);
343        }
344
345        public OrderCompleteBuilder setTotalPrice(double total) {
346            return (OrderCompleteBuilder) set("total", total);
347        }
348
349        public OrderCompleteBuilder setTotalDiscount(double dct) {
350            return (OrderCompleteBuilder) set("dct", dct);
351        }
352
353        public OrderCompleteBuilder setCheckoutMode(String ckmode) {
354            return (OrderCompleteBuilder) set("ckmode", ckmode);
355        }
356
357        public OrderCompleteBuilder setRecommendationRequestID(String rtkn) {
358            return (OrderCompleteBuilder) set("rtkn", rtkn);
359        }
360
361        public OrderCompleteBuilder addProduct(ProductBuilder product) {
362            return (OrderCompleteBuilder) addToArray("products", product.build());
363        }
364    }
365
366    public static class CheckoutInitiateBuilder extends BaseMessageBuilder {
367        CheckoutInitiateBuilder() {
368            super();
369            set("event", "CheckoutInitiate");
370            setHitTimestamp(System.currentTimeMillis());
371        }
372
373        public CheckoutInitiateBuilder setTransactionID(String tnid) {
374            return (CheckoutInitiateBuilder) set("tnid", tnid);
375        }
376
377        public CheckoutInitiateBuilder setTotalPrice(double total) {
378            return (CheckoutInitiateBuilder) set("total", total);
379        }
380
381        public CheckoutInitiateBuilder setTotalDiscount(double dct) {
382            return (CheckoutInitiateBuilder) set("dct", dct);
383        }
384
385        public CheckoutInitiateBuilder setPromo(String promo) {
386            return (CheckoutInitiateBuilder) set("promo", promo);
387        }
388
389        public CheckoutInitiateBuilder setRecommendationRequestID(String rtkn) {
390            return (CheckoutInitiateBuilder) set("rtkn", rtkn);
391        }
392
393        public CheckoutInitiateBuilder setProductListingName(String linm) {
394            return (CheckoutInitiateBuilder) set("linm", linm);
395        }
396
397        public CheckoutInitiateBuilder addProduct(ProductBuilder product) {
398            return (CheckoutInitiateBuilder) addToArray("products", product.build());
399        }
400    }
401
402    public static class RemoveFromCartBuilder extends ProductBuilder {
403        RemoveFromCartBuilder() {
404            super();
405            set("event", "RemoveFromCart");
406            setHitTimestamp(System.currentTimeMillis());
407        }
408    }
409
410    public static class AddToCartBuilder extends ProductBuilder {
411        AddToCartBuilder() {
412            super();
413            set("event", "AddToCart");
414            setHitTimestamp(System.currentTimeMillis());
415        }
416
417        public AddToCartBuilder setProductListingName(String linm) {
418            return (AddToCartBuilder) set("linm", linm);
419        }
420
421        public AddToCartBuilder setRecommendationRequestID(String rtkn) {
422            return (AddToCartBuilder) set("rtkn", rtkn);
423        }
424    }
425
426    public static class ProductViewBuilder extends ProductBuilder {
427        ProductViewBuilder() {
428            super();
429            set("event", "ProductView");
430            setHitTimestamp(System.currentTimeMillis());
431        }
432
433        public ProductViewBuilder setProductListingName(String linm) {
434            return (ProductViewBuilder) set("linm", linm);
435        }
436
437        public ProductViewBuilder setRecommendationRequestID(String rtkn) {
438            return (ProductViewBuilder) set("rtkn", rtkn);
439        }
440    }
441
442    public static class ProductClickBuilder extends ProductBuilder {
443        ProductClickBuilder() {
444            super();
445            set("event", "ProductClick");
446            setHitTimestamp(System.currentTimeMillis());
447        }
448
449        public ProductClickBuilder setProductListingName(String linm) {
450            return (ProductClickBuilder) set("linm", linm);
451        }
452
453        public ProductClickBuilder setRecommendationRequestID(String rtkn) {
454            return (ProductClickBuilder) set("rtkn", rtkn);
455        }
456    }
457
458    public static class SavedSearchUpdateBuilder extends BaseMessageBuilder {
459        SavedSearchUpdateBuilder() {
460            super();
461            set("event", "SavedSearchUpdate");
462            setHitTimestamp(System.currentTimeMillis());
463        }
464
465        public SavedSearchUpdateBuilder setSearchName(String ss) {
466            return (SavedSearchUpdateBuilder) set("ss", ss);
467        }
468
469        public SavedSearchUpdateBuilder addFilterBy(FilterByBuilder filtersby) {
470            return (SavedSearchUpdateBuilder) addToArray("filtersby", filtersby.build());
471        }
472
473        public SavedSearchUpdateBuilder addNotify(NotifyBuilder snotify) {
474            return (SavedSearchUpdateBuilder) addToArray("snotify", snotify.build());
475        }
476    }
477
478    public static class SaveSearchClickBuilder extends BaseMessageBuilder {
479        SaveSearchClickBuilder() {
480            super();
481            set("event", "SaveSearchClick");
482            setHitTimestamp(System.currentTimeMillis());
483        }
484
485        public SaveSearchClickBuilder setSearchName(String ssnm) {
486            return (SaveSearchClickBuilder) set("ssnm", ssnm);
487        }
488
489        public SaveSearchClickBuilder addFilterBy(FilterByBuilder filtersby) {
490            return (SaveSearchClickBuilder) addToArray("filtersby", filtersby.build());
491        }
492
493        public SaveSearchClickBuilder addNotify(NotifyBuilder snotify) {
494            return (SaveSearchClickBuilder) addToArray("snotify", snotify.build());
495        }
496    }
497
498    public static class NotifyBuilder extends BaseMessageBuilder {
499        public NotifyBuilder setType(String snftype) {
500            return (NotifyBuilder) set("snftype", snftype);
501        }
502
503        public NotifyBuilder setOption(boolean snfval) {
504            return (NotifyBuilder) set("snfval", snfval ? "yes" : "no");
505        }
506    }
507
508    public static class ProductSearchBuilder extends BaseMessageBuilder {
509        ProductSearchBuilder() {
510            super();
511            set("event", "ProductsSearch");
512            setHitTimestamp(System.currentTimeMillis());
513        }
514
515        public ProductSearchBuilder setQuery(String qry) {
516            return (ProductSearchBuilder) set("qry", qry);
517        }
518
519        public ProductSearchBuilder addFilterBy(FilterByBuilder filtersby) {
520            return (ProductSearchBuilder) addToArray("filtersby", filtersby.build());
521        }
522    }
523
524    public static class ProductListViewBuilder extends BaseMessageBuilder {
525        ProductListViewBuilder() {
526            super();
527            set("event", "ProductListView");
528            setHitTimestamp(System.currentTimeMillis());
529        }
530
531        public ProductListViewBuilder setProductCategory(String pcat) {
532            return (ProductListViewBuilder) set("pcat", pcat);
533        }
534
535        public ProductListViewBuilder addFilterBy(FilterByBuilder filtersby) {
536            return (ProductListViewBuilder) addToArray("filtersby", filtersby.build());
537        }
538
539        public ProductListViewBuilder addProduct(ProductBuilder product) {
540            return (ProductListViewBuilder) addToArray("products", product.build());
541        }
542
543        public ProductListViewBuilder setSortType(String sort) {
544            return (ProductListViewBuilder) set("sort", sort);
545        }
546
547        public ProductListViewBuilder setProductListingName(String linm) {
548            return (ProductListViewBuilder) set("linm", linm);
549        }
550
551        public ProductListViewBuilder setRecommendationRequestID(String rtkn) {
552            return (ProductListViewBuilder) set("rtkn", rtkn);
553        }
554    }
555
556    public static class ProductBuilder extends BaseMessageBuilder {
557        public ProductBuilder setSkuId(String skid) {
558            return (ProductBuilder) set("skid", skid);
559        }
560
561        public ProductBuilder setVariantId(String varid) {
562            return (ProductBuilder) set("varid", varid);
563        }
564
565        public ProductBuilder setSize(String sz) {
566            return (ProductBuilder) set("sz", sz);
567        }
568
569        public ProductBuilder setPrice(double pr) {
570            return (ProductBuilder) set("pr", pr);
571        }
572
573        public ProductBuilder setSalePrice(double spr) {
574            return (ProductBuilder) set("spr", spr);
575        }
576
577        public ProductBuilder setCurrencyCode(String cur) {
578            return (ProductBuilder) set("cur", cur);
579        }
580
581        public ProductBuilder setPromo(String promo) {
582            return (ProductBuilder) set("promo", promo);
583        }
584
585        public ProductBuilder setAvailabilityStatus(String pavs) {
586            return (ProductBuilder) set("pavs", pavs);
587        }
588
589        public ProductBuilder setBadgeName(String bdg) {
590            return (ProductBuilder) set("bdg", bdg);
591        }
592
593        public ProductBuilder setFavoriteCount(int fvct) {
594            return (ProductBuilder) set("fvct", fvct);
595        }
596
597        public ProductBuilder setPosition(int pos) {
598            return (ProductBuilder) set("pos", pos);
599        }
600
601        public ProductBuilder setRemainingTime(String rtime) {
602            return (ProductBuilder) set("rtime", rtime);
603        }
604
605        public ProductBuilder setQuantity(int qty) {
606            return (ProductBuilder) set("qty", qty);
607        }
608    }
609
610    public static class FilterByBuilder extends BaseMessageBuilder {
611        public FilterByBuilder setFilterCategory(String fcat) {
612            return (FilterByBuilder) set("fcat", fcat);
613        }
614
615        public FilterByBuilder addFilterValues(String... fval) {
616            if (fval != null) {
617                for (String v : fval) {
618                    addToArray("fval", v);
619                }
620            }
621            return this;
622        }
623    }
624
625    public static class BaseMessageBuilder {
626        private static final String LOG_TAG = "Lily_AI.datafactory";
627        private JSONObject data = new JSONObject();
628
629        BaseMessageBuilder() {}
630
631        public JSONObject build() {
632            return data;
633        }
634
635        public BaseMessageBuilder set(String key, String value) {
636            try {
637                data.put(key, value);
638            } catch (JSONException e) {
639                Log.e(LOG_TAG, e.getMessage(), e);
640            }
641            return this;
642        }
643
644        public BaseMessageBuilder set(String key, double value) {
645            try {
646                data.put(key, value);
647            } catch (JSONException e) {
648                Log.e(LOG_TAG, e.getMessage(), e);
649            }
650            return this;
651        }
652
653        public BaseMessageBuilder set(String key, long value) {
654            try {
655                data.put(key, value);
656            } catch (JSONException e) {
657                Log.e(LOG_TAG, e.getMessage(), e);
658            }
659            return this;
660        }
661
662        public BaseMessageBuilder set(String key, int value) {
663            try {
664                data.put(key, value);
665            } catch (JSONException e) {
666                Log.e(LOG_TAG, e.getMessage(), e);
667            }
668            return this;
669        }
670
671        public BaseMessageBuilder set(String key, boolean value) {
672            try {
673                data.put(key, value);
674            } catch (JSONException e) {
675                Log.e(LOG_TAG, e.getMessage(), e);
676            }
677            return this;
678        }
679
680        public BaseMessageBuilder set(String key, JSONObject value) {
681            try {
682                data.put(key, value);
683            } catch (JSONException e) {
684                Log.e(LOG_TAG, e.getMessage(), e);
685            }
686            return this;
687        }
688
689        public BaseMessageBuilder set(String key, JSONArray value) {
690            try {
691                data.put(key, value);
692            } catch (JSONException e) {
693                Log.e(LOG_TAG, e.getMessage(), e);
694            }
695            return this;
696        }
697
698        public BaseMessageBuilder set(String key, Object value) {
699            try {
700                data.put(key, value);
701            } catch (JSONException e) {
702                Log.e(LOG_TAG, e.getMessage(), e);
703            }
704            return this;
705        }
706
707        public BaseMessageBuilder addToArray(String key, Object value) {
708            try {
709                JSONArray arr;
710                if (data.has(key)) {
711                    arr = data.getJSONArray(key);
712                } else {
713                    arr = new JSONArray();
714                    data.put(key, arr);
715                }
716                arr.put(value);
717            } catch (JSONException e) {
718                Log.e(LOG_TAG, e.getMessage(), e);
719            }
720            return this;
721        }
722
723        public BaseMessageBuilder setHitTimestamp(long hts) {
724            return set("hts", hts);
725        }
726    }
727}