File size: 6,287 Bytes
943ca21
e406115
 
a8db628
e406115
a85dd4d
b89610e
e406115
 
b17b983
0807a82
b89610e
e406115
a8db628
b89610e
e406115
 
 
b17b983
b89610e
e406115
a85dd4d
b89610e
6264a0c
e406115
 
6264a0c
29f9a6c
6264a0c
 
b89610e
29f9a6c
6264a0c
b89610e
6264a0c
 
 
 
20ff6eb
e406115
6264a0c
03931e3
 
 
e406115
a85dd4d
6264a0c
e406115
b89610e
a85dd4d
03931e3
 
 
 
 
 
 
b89610e
b17b983
 
b89610e
7efb0fd
b17b983
 
03931e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e406115
03931e3
 
 
 
 
e406115
03931e3
 
 
 
 
e406115
03931e3
 
 
 
 
e406115
03931e3
 
 
 
 
e406115
03931e3
 
 
 
 
a8db628
03931e3
 
 
 
 
 
 
6264a0c
03931e3
a8db628
03931e3
 
 
 
 
 
 
 
 
 
b17b983
943ca21
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
import gradio as gr
import os
import pandas as pd

BASE_DIR = "data"

# Get subfolders
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 []

# Get CSV files
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 []

# Load quantities from brand CSV
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), {}

# Show result based on quantity
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":
            return (
                f"βœ… {quantity} is available!\n"
                f"\u2022 Floor: {row['Floor']}\n"
                f"\u2022 Aisle: {row['Aisle']}\n"
                f"\u2022 Price: β‚Ή{row['Price']}"
            )
        else:
            return f"❌ Sorry, {quantity} is currently not in stock."
    except Exception as e:
        return f"⚠️ Error: {e}"

# Dummy AI suggestion function
def suggest_items(query):
    query = query.lower()
    if "gift" in query and "500" in query:
        return "1. Bath & Body Gift Set - β‚Ή499\n2. Mini Perfume Pack - β‚Ή349\n3. Skin Care Hamper - β‚Ή399"
    return "🎁 Sorry, no suggestions found for your query. Try something like: 'Gift items under 500'"

# Reset all
def reset_all():
    return (
        None, None, None, None, None, None, None,
        gr.update(choices=[], visible=False), "", {}
    )

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

    with gr.Tabs():
        # ---------------- Tab 1: Navigator ----------------
        with gr.TabItem("🧭 Navigator"):
            with gr.Row():
                country = gr.Dropdown(label="🌍 Country", choices=get_subfolders(BASE_DIR), value=None)
                state = gr.Dropdown(label="πŸŒ† State", choices=[], interactive=False)
                city = gr.Dropdown(label="🏘️ City", choices=[], interactive=False)
                store = gr.Dropdown(label="πŸͺ Store", choices=[], interactive=False)
                category = gr.Dropdown(label="🏍️ Category", choices=[], interactive=False)
                product = gr.Dropdown(label="πŸ“¦ Product", choices=[], interactive=False)
                brand = gr.Dropdown(label="🏷️ Brand", choices=[], interactive=False)
                quantity = gr.Dropdown(label="πŸ”’ Quantity", visible=False)

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

            # Dropdown logic
            country.change(
                lambda c: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c)) if c else [], value=None, interactive=True),
                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, interactive=True),
                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, interactive=True),
                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, interactive=True),
                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, interactive=True),
                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])

        # ---------------- Tab 2: Smart Suggestions ----------------
        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()