File size: 6,667 Bytes
ffb5f88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
165
166
167
168
169
170
171
172
173
174
175
176
177
"""

Post Event Feedback Scenario Handler

Collects feedback after user attends an event

"""
from typing import Dict, Any
from .base_handler import BaseScenarioHandler


class PostEventFeedbackHandler(BaseScenarioHandler):
    """

    Handle post-event feedback flow

    

    Requires initial_data: {event_name, event_date, event_id}

    

    Steps:

    1. Ask for rating (1-5 stars)

    2. Ask what they liked most

    3. Ask for improvement suggestions

    4. Thank + ask if want similar events

    5. Collect email for future events

    """
    
    def start(self, initial_data: Dict = None) -> Dict[str, Any]:
        """Start feedback flow with event context"""
        initial_data = initial_data or {}
        event_name = initial_data.get('event_name', 'sự kiện')
        
        return {
            "message": f"Cảm ơn bạn đã tham dự *{event_name}* hôm qua! 🎉\n\nBạn thấy trải nghiệm như thế nào? (1-5 sao)",
            "new_state": {
                "active_scenario": "post_event_feedback",
                "scenario_step": 1,
                "scenario_data": initial_data
            }
        }
    
    def next_step(self, current_step: int, user_input: str, scenario_data: Dict) -> Dict[str, Any]:
        """Process feedback and advance"""
        
        expected_type = self._get_expected_type(current_step)
        unexpected = self.handle_unexpected_input(user_input, expected_type, current_step)
        if unexpected:
            return unexpected
        
        # STEP 1: Collect rating
        if current_step == 1:
            rating = self._extract_rating(user_input)
            scenario_data['rating'] = rating
            
            if rating >= 4:
                msg = "Tuyệt vời! 🎉 Bạn thích điểm gì nhất về event?"
            else:
                msg = "Cảm ơn feedback! Bạn thấy event cần cải thiện điểm nào?"
            
            return {
                "message": msg,
                "new_state": {
                    "active_scenario": "post_event_feedback",
                    "scenario_step": 2,
                    "scenario_data": scenario_data
                },
                "scenario_active": True
            }
        
        # STEP 2: What they liked/disliked
        elif current_step == 2:
            scenario_data['feedback_text'] = user_input
            
            return {
                "message": "Cảm ơn bạn nhiều! Feedback này giúp chúng mình rất nhiều 💙\n\nBạn muốn nhận thông tin về các event tương tự không?",
                "new_state": {
                    "active_scenario": "post_event_feedback",
                    "scenario_step": 4,
                    "scenario_data": scenario_data
                },
                "scenario_active": True
            }
        
        # STEP 4: Want similar events?
        elif current_step == 4:
            choice = self._detect_yes_no(user_input)
            
            if choice == 'yes':
                return {
                    "message": "Tuyệt! Cho mình xin email để gửi thông tin event sắp tới nhé?",
                    "new_state": {
                        "active_scenario": "post_event_feedback",
                        "scenario_step": 5,
                        "scenario_data": scenario_data
                    },
                    "scenario_active": True
                }
            else:
                # Save feedback without email
                self._save_feedback(scenario_data)
                
                return {
                    "message": "Okie! Cảm ơn bạn đã dành thời gian góp ý 🙏",
                    "new_state": None,
                    "scenario_active": False,
                    "end_scenario": True
                }
        
        # STEP 5: Collect email
        elif current_step == 5:
            email = user_input.strip()
            
            if not self._validate_email(email):
                return {
                    "message": "Email này có vẻ không đúng. Bạn nhập lại giúp mình nhé?",
                    "new_state": None,
                    "scenario_active": True
                }
            
            scenario_data['email'] = email
            
            # Save feedback + email
            self._save_feedback(scenario_data)
            
            # Save lead
            try:
                self.lead_storage.save_lead(
                    event_name=scenario_data.get('event_name'),
                    email=email,
                    interests={"wants_similar_events": True},
                    session_id=scenario_data.get('session_id')
                )
                print(f"📧 Feedback + lead saved: {email}")
            except Exception as e:
                print(f"⚠️ Error saving lead: {e}")
            
            return {
                "message": "Cảm ơn bạn! Mình sẽ gửi thông tin event mới cho bạn sớm nhất ✨",
                "new_state": None,
                "scenario_active": False,
                "end_scenario": True
            }
        
        # Fallback
        return {
            "message": "Cảm ơn bạn! Hẹn gặp lại ✨",
            "new_state": None,
            "scenario_active": False,
            "end_scenario": True
        }
    
    def _get_expected_type(self, step: int) -> str:
        """Get expected input type"""
        type_map = {
            1: 'rating',
            2: 'text',
            4: 'choice',
            5: 'email'
        }
        return type_map.get(step, 'text')
    
    def _extract_rating(self, user_input: str) -> int:
        """Extract rating from user input"""
        import re
        # Look for numbers 1-5
        match = re.search(r'[1-5]', user_input)
        if match:
            return int(match.group())
        
        # Default to 3 if can't extract
        return 3
    
    def _detect_yes_no(self, user_input: str) -> str:
        """Detect yes/no"""
        input_lower = user_input.lower()
        return 'yes' if any(k in input_lower for k in ['có', 'yes', 'ok', 'được', 'ừ']) else 'no'
    
    def _save_feedback(self, scenario_data: Dict):
        """Save feedback to database (placeholder)"""
        # TODO: Implement actual feedback storage
        print(f"💾 Feedback saved: {scenario_data.get('rating')} stars - {scenario_data.get('feedback_text', '')[:50]}")