File size: 7,059 Bytes
943ca21
c872642
 
bb46751
c872642
8b47930
c872642
8b47930
d1068de
8b47930
d1068de
 
 
8b47930
 
 
c872642
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bb46751
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c872642
b17b983
 
252e1fa
75633af
 
fc02939
b17b983
 
8b47930
c872642
bb46751
c872642
 
 
 
8b47930
bb46751
 
8b47930
bb46751
8b47930
bb46751
8b47930
c872642
 
c2aabeb
c872642
 
fc02939
75633af
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0fe83aa
75633af
 
 
 
 
 
 
0fe83aa
c872642
 
 
bb46751
 
 
 
 
 
 
 
 
c872642
bb46751
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import gradio as gr
import os
import pandas as pd
from PIL import Image

# ----- Config -----
BASE_DIR = "data"
ASSETS_DIR = "assets"
DEFAULT_MAP = os.path.join(ASSETS_DIR, "default_map.jpg")
PRODUCT_IMAGE_MAP = {
    "shampoo": os.path.join(ASSETS_DIR, "shampoo_map.jpg"),
    "curd": os.path.join(ASSETS_DIR, "curd_map.jpg"),
    "ghee": os.path.join(ASSETS_DIR, "ghee_map.jpg")
}

# ----- Utilities -----
def get_subfolders(path):
    try:
        return sorted([f for f in os.listdir(path) if os.path.isdir(os.path.join(path, f))])
    except Exception as e:
        print(f"❌ Error reading subfolders from {path}: {e}")
        return []

def get_csv_files(path):
    try:
        return sorted([f[:-4] for f in os.listdir(path) if f.endswith(".csv")])
    except Exception as e:
        print(f"❌ Error reading CSVs from {path}: {e}")
        return []

def get_quantities_from_csv(path):
    try:
        df = pd.read_csv(path)
        if df.empty or "Quantity" not in df.columns:
            return gr.update(choices=[], visible=False), {}
        return gr.update(choices=df["Quantity"].dropna().tolist(), visible=True), df.to_dict()
    except Exception as e:
        print(f"❌ Error loading CSV: {e}")
        return gr.update(choices=[], visible=False), {}

def display_quantity_info(quantity, data_dict):
    try:
        df = pd.DataFrame(data_dict)
        row = df[df["Quantity"] == quantity].iloc[0]
        if str(row["In Stock"]).strip().lower() == "yes":
            msg = (
                f"βœ… {quantity} is available!\n"
                f"β€’ Floor: {row['Floor']}\n"
                f"β€’ Aisle: {row['Aisle']}\n"
                f"β€’ Price: β‚Ή{row['Price']}"
            )
            if "Offer" in row and pd.notna(row["Offer"]) and row["Offer"].strip():
                msg += f"\nβ€’ πŸŽ‰ Offer: {row['Offer']}"
            return msg
        else:
            return f"❌ Sorry, {quantity} is currently not in stock."
    except Exception as e:
        return f"⚠ Error: {e}"

# Smart Suggestions Function
def suggest_items(query):
    query = query.lower()
    if "gift" in query and "500" in query:
        return (
            "🎁 Gift Suggestions under β‚Ή500:\n"
            "1. Bath & Body Gift Set - β‚Ή499\n"
            "2. Mini Perfume Pack - β‚Ή349\n"
            "3. Skin Care Hamper - β‚Ή399\n"
            "4. Chocolates Gift Box - β‚Ή299"
        )
    if "shampoo" in query and "dry" in query:
        return (
            "🧴 Shampoos for Dry Hair:\n"
            "1. Dove 500 ml - β‚Ή325\n"
            "2. Clinic Plus 500 ml - β‚Ή680"
        )
    return "🀷 Sorry, no smart suggestions found. Try asking: 'Gift items under 500' or 'Shampoo for dry hair'"

def reset_all():
    return (
        None, None, None, None, None, None, None,
        gr.update(choices=[], visible=False),  # quantity dropdown reset
        "",  # result textbox reset
        {}  # data_state (gr.State) reset with raw dict
    )

# ----- UI -----
with gr.Blocks(title="RetailGenie") as demo:
    gr.Markdown("# πŸ§žβ€β™‚ RetailGenie – In-Store Smart Assistant")

    with gr.Tabs():
        with gr.TabItem("🧭 Navigator"):
            with gr.Row():
                country = gr.Dropdown(label="🌍 Country", choices=get_subfolders(BASE_DIR), interactive=True)
                state = gr.Dropdown(label="πŸ™ State", choices=[], interactive=True)
                city = gr.Dropdown(label="🏘 City", choices=[], interactive=True)
                store = gr.Dropdown(label="πŸͺ Store", choices=[], interactive=True)
                category = gr.Dropdown(label="πŸ› Category", choices=[], interactive=True)
                product = gr.Dropdown(label="πŸ“¦ Product", choices=[], interactive=True)
                brand = gr.Dropdown(label="🏷 Brand", choices=[], interactive=True)
                quantity = gr.Dropdown(label="πŸ”’ Quantity", visible=False, interactive=True)

            result = gr.Textbox(label="πŸ” Product Info", lines=5)
            data_state = gr.State()
            reset_btn = gr.Button("πŸ”„ Reset All")

            # Dropdown chaining
            country.change(
                lambda c: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c)) if c else [], value=None),
                inputs=country, outputs=state
            )
            state.change(
                lambda c, s: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s)) if c and s else [], value=None),
                inputs=[country, state], outputs=city
            )
            city.change(
                lambda c, s, ci: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s, ci)) if c and s and ci else [], value=None),
                inputs=[country, state, city], outputs=store
            )
            store.change(
                lambda c, s, ci, st: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s, ci, st)) if all([c, s, ci, st]) else [], value=None, interactive=True),
                inputs=[country, state, city, store], outputs=category
            )
            category.change(
                lambda c, s, ci, st, cat: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s, ci, st, cat)) if all([c, s, ci, st, cat]) else [], value=None),
                inputs=[country, state, city, store, category], outputs=product
            )
            product.change(
                lambda c, s, ci, st, cat, prod: gr.update(choices=get_csv_files(os.path.join(BASE_DIR, c, s, ci, st, cat, prod)) if all([c, s, ci, st, cat, prod]) else [], value=None),
                inputs=[country, state, city, store, category, product], outputs=brand
            )
            brand.change(
                lambda c, s, ci, st, cat, prod, b: get_quantities_from_csv(os.path.join(BASE_DIR, c, s, ci, st, cat, prod, f"{b}.csv")) if all([c, s, ci, st, cat, prod, b]) else (gr.update(choices=[], visible=False), {}),
                inputs=[country, state, city, store, category, product, brand],
                outputs=[quantity, data_state]
            )
            quantity.change(
                display_quantity_info,
                inputs=[quantity, data_state],
                outputs=result
            )
            reset_btn.click(
                reset_all,
                inputs=[],
                outputs=[
                    country, state, city, store,
                    category, product, brand, quantity,
                    result, data_state
                ]
            )

        with gr.TabItem("🎁 Smart Suggestions"):
            gr.Markdown("### πŸ€– Ask RetailGenie for Recommendations")
            suggestion_input = gr.Textbox(label="Ask something like:", placeholder="Gift items under 500", lines=1)
            suggest_btn = gr.Button("πŸ’‘ Get Suggestions")
            suggestions_output = gr.Textbox(label="πŸ“ Suggestions", lines=10)

            suggest_btn.click(
                suggest_items,
                inputs=suggestion_input,
                outputs=suggestions_output
            )

demo.launch()