File size: 5,545 Bytes
078556c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import data_manager
import gemini_client
import re
import os
def extract_order_id(query):
    """Attempts to extract an order ID (assumed to be a number) from the query."""
    match = re.search(r'\b\d+\b', query)
    if match:
        return int(match.group(0))
    return None

def format_prompt(query, order_details=None, order_items=None, recent_orders=None):
    """Formats the prompt for the Gemini API, including context."""
    prompt = f"You are an e-commerce customer support assistant. Answer the user's query based *only* on the provided information. If the information is insufficient, say so.\n\nUser Query: \"{query}\"\n\n"

    if order_details:
        prompt += "--- Order Information ---\n"
        prompt += f"Order ID: {order_details.get('order_id')}\n"
        prompt += f"Customer: {order_details.get('user_name')} ({order_details.get('email')})\n"
        prompt += f"Date: {order_details.get('order_date')}\n"
        prompt += f"Status: {order_details.get('status')}\n"
        prompt += f"Total: ${order_details.get('total_amount'):.2f}\n"

    if order_items:
        prompt += "\n--- Items in Order ---\n"
        for item in order_items:
            prompt += f"- {item.get('product_name')} (Qty: {item.get('quantity')}, Price/Unit: ${item.get('price_per_unit'):.2f})\n"

    if recent_orders:
        prompt += "\n--- Recent Orders ---\n"
        for order in recent_orders:
             prompt += f"- Order ID: {order.get('order_id')}, Date: {order.get('order_date')}, Status: {order.get('status')}, Total: ${order.get('total_amount'):.2f}\n"

    prompt += "\n---\nAssistant Response:"
    return prompt

def main():
    """Main loop for the chatbot interaction."""
    print("Welcome to the E-commerce Chat Assistant!")
    print("You can ask about order status, items, or recent orders.")
    print("Example: 'What is the status of order 1?' or 'Show my recent orders for alice@example.com'")
    print("Type 'quit' to exit.")

    # Basic way to identify user - could be improved with login simulation
    user_email = input("Please enter your email address to start: ")
    user_info = data_manager.get_user_by_email(user_email)
    if not user_info:
        print(f"User with email {user_email} not found. Exiting.")
        return
    print(f"Welcome, {user_info['name']}!")
    user_id = user_info['user_id']


    while True:
        query = input("\nYour query: ")
        if query.lower() == 'quit':
            break

        order_id = extract_order_id(query)
        order_details = None
        order_items = None
        recent_orders = None

        try:
            # Determine context based on query and extracted info
            if order_id:
                order_details = data_manager.get_order_details(order_id)
                if order_details:
                    # Security check: Ensure the order belongs to the logged-in user
                    if order_details['email'] != user_email:
                         print(f"Order {order_id} does not belong to user {user_email}.")
                         order_details = None # Clear details if not authorized
                    else:
                        # Fetch items only if order details are valid and authorized
                        order_items = data_manager.get_order_items(order_id)
                else:
                    print(f"Order ID {order_id} not found.")

            # Check for recent orders query (simple keyword check)
            elif "recent orders" in query.lower() or "my orders" in query.lower():
                 recent_orders = data_manager.get_user_recent_orders(user_id)
                 if not recent_orders:
                     print("You have no recent orders.")


            # Construct and send prompt if we have relevant context
            if order_details or recent_orders:
                prompt = format_prompt(query, order_details, order_items, recent_orders)
                print("\nAssistant thinking...")
                response = gemini_client.get_gemini_response(prompt)
                print(f"\nAssistant: {response}")
            elif order_id and not order_details:
                 # Already handled the "not found" or "not authorized" message
                 pass
            else:
                # If no specific context found, try sending the query directly (less reliable)
                # Or inform the user context is needed
                # print("Could not determine specific order information. Trying a general query...")
                # prompt = format_prompt(query) # Send without specific context
                # response = gemini_client.get_gemini_response(prompt)
                # print(f"\nAssistant: {response}")
                 print("Please specify an order ID or ask about 'recent orders'.")


        except FileNotFoundError as e:
            print(f"Error: {e}. Please ensure the database exists.")
            break
        except Exception as e:
            print(f"An unexpected error occurred: {e}")

    print("Goodbye!")

if __name__ == "__main__":
    # Optional: Run data generation if DB doesn't exist?
    # For simplicity, we assume generate_data.py is run manually first.
    if not os.path.exists(data_manager.DB_PATH):
         print(f"Database not found at {data_manager.DB_PATH}.")
         print("Please run 'python generate_data.py' first to create and populate the database.")
    else:
        main()