# 🔄 Logic Flow: Agent nhận ngày hôm nay → Sinh query → Gửi cho tool

## 📋 Tổng quan luồng xử lý

```
1. Agent nhận ngày hôm nay
   ↓
2. Format ngày thành YYYY-MM-DD
   ↓
3. Thêm vào Filter Context
   ↓
4. Filter Context sync với URL
   ↓
5. Hook useMemoFilters convert filter → query string
   ↓
6. Query string được truyền vào API call
   ↓
7. API nhận query và trả về kết quả
```

---

## 🔍 Chi tiết từng bước

### **Bước 1: Agent nhận ngày hôm nay** 
📍 File: `frontend/src/pages/Home.tsx` (dòng 18-36)

```typescript
useEffect(() => {
  if (!user) return;
  
  const hasFilterInUrl = searchParams.has("filter");
  
  if (!hasFilterInUrl) {
    // ✅ LẤY NGÀY HÔM NAY
    const today = new Date();
    const year = today.getUTCFullYear();
    const month = String(today.getUTCMonth() + 1).padStart(2, "0");
    const day = String(today.getUTCDate()).padStart(2, "0");
    const todayStr = `${year}-${month}-${day}`; // VD: "2026-01-24"
    
    // ✅ THÊM VÀO FILTER
    addFilter({ factor: "displayTime", value: todayStr });
  }
}, [user, searchParams, addFilter]);
```

**Giải thích:**
- Agent (component Home) tự động lấy ngày hôm nay khi component mount
- Format thành chuỗi `YYYY-MM-DD` (UTC)
- Chỉ thêm filter nếu URL chưa có filter nào

---

### **Bước 2: Filter được lưu vào Context**
📍 File: `frontend/src/contexts/MemoFilterContext.tsx` (dòng 101-103)

```typescript
const addFilter = useCallback((filter: MemoFilter) => {
  setFiltersState((prev) => uniqBy([...prev, filter], getMemoFilterKey));
}, []);
```

**Giải thích:**
- `addFilter` thêm filter vào state `filters`
- State được lưu trong `MemoFilterContext`
- Context tự động sync với URL query params

---

### **Bước 3: Filter sync với URL**
📍 File: `frontend/src/contexts/MemoFilterContext.tsx` (dòng 79-93)

```typescript
useEffect(() => {
  const storeString = stringifyFilters(filters);
  // VD: "displayTime:2026-01-24"
  
  if (storeString !== lastSyncedStoreRef.current) {
    const newParams = new URLSearchParams(searchParams);
    if (filters.length > 0) {
      newParams.set("filter", storeString); // URL: ?filter=displayTime:2026-01-24
    }
    setSearchParams(newParams, { replace: true });
  }
}, [filters, searchParams, setSearchParams]);
```

**Giải thích:**
- Filter được convert thành string: `"displayTime:2026-01-24"`
- String này được thêm vào URL: `?filter=displayTime:2026-01-24`
- Giúp user có thể bookmark/share URL với filter

---

### **Bước 4: Hook convert Filter → Query String**
📍 File: `frontend/src/hooks/useMemoFilters.ts` (dòng 78-96)

```typescript
// Trong useMemoFilters hook
for (const filter of filters) {
  if (filter.factor === "displayTime") {
    const displayWithUpdateTime = memoRelatedSetting?.displayWithUpdateTime ?? false;
    const factor = displayWithUpdateTime ? "updated_ts" : "created_ts";
    
    // ✅ PARSE NGÀY TỪ STRING
    const dateParts = filter.value.split("-"); // ["2026", "01", "24"]
    if (dateParts.length === 3) {
      const year = parseInt(dateParts[0], 10);
      const month = parseInt(dateParts[1], 10) - 1; // JS months 0-indexed
      const day = parseInt(dateParts[2], 10);
      
      // ✅ TẠO UTC TIMESTAMP (00:00:00 UTC của ngày đó)
      const utcDate = new Date(Date.UTC(year, month, day, 0, 0, 0, 0));
      const timestampAfter = Math.floor(utcDate.getTime() / 1000); // VD: 1706054400
      const timestampEnd = timestampAfter + 60 * 60 * 24; // +24 giờ
      
      // ✅ SINH QUERY STRING
      conditions.push(`${factor} >= ${timestampAfter} && ${factor} < ${timestampEnd}`);
      // VD: "created_ts >= 1706054400 && created_ts < 1706140800"
    }
  }
}

return conditions.length > 0 ? conditions.join(" && ") : undefined;
```

**Giải thích:**
- Hook đọc filter từ Context
- Parse ngày `"2026-01-24"` → timestamp UTC
- Tạo range: từ 00:00:00 đến 23:59:59 của ngày đó
- Sinh query string: `"created_ts >= 1706054400 && created_ts < 1706140800"`

---

### **Bước 5: Query được truyền vào Component**
📍 File: `frontend/src/pages/Home.tsx` (dòng 39-43, 65-72)

```typescript
// ✅ BUILD FILTER QUERY
const memoFilter = useMemoFilters({
  creatorName: user?.name,
  includeShortcuts: true,
  includePinned: true,
});

// ✅ TRUYỀN VÀO PagedMemoList
<PagedMemoList
  filter={memoFilter} // "created_ts >= 1706054400 && created_ts < 1706140800"
  // ... other props
/>
```

**Giải thích:**
- `useMemoFilters` trả về query string
- Query string được truyền vào `PagedMemoList` component qua prop `filter`

---

### **Bước 6: Query được gửi đến API**
📍 File: `frontend/src/components/PagedMemoList/PagedMemoList.tsx` (dòng 92-97)

```typescript
const { data, fetchNextPage, hasNextPage } = useInfiniteMemos({
  state: props.state || State.NORMAL,
  orderBy: props.orderBy || "display_time desc",
  filter: props.filter, // ✅ Query string từ bước 5
  pageSize: props.pageSize || DEFAULT_LIST_MEMOS_PAGE_SIZE,
});
```

📍 File: `frontend/src/hooks/useMemoQueries.ts` (dòng 29-46)

```typescript
export function useInfiniteMemos(request: Partial<ListMemosRequest> = {}) {
  return useInfiniteQuery({
    queryKey: memoKeys.list(request),
    queryFn: async ({ pageParam }) => {
      // ✅ GỌI API VỚI FILTER
      const response = await memoServiceClient.listMemos(
        create(ListMemosRequestSchema, {
          ...request, // { filter: "created_ts >= 1706054400 && created_ts < 1706140800" }
          pageToken: pageParam || "",
        })
      );
      return response;
    },
    // ...
  });
}
```

**Giải thích:**
- `useInfiniteMemos` nhận `filter` trong request object
- Gọi `memoServiceClient.listMemos()` với filter
- API backend nhận filter và query database

---

## ✅ Kết luận

**Logic ĐÚNG và HOẠT ĐỘNG TỐT:**

1. ✅ Agent (Home component) tự động nhận ngày hôm nay
2. ✅ Format ngày thành `YYYY-MM-DD`
3. ✅ Lưu vào Filter Context
4. ✅ Context sync với URL
5. ✅ Hook `useMemoFilters` convert filter → query string với timestamp
6. ✅ Query string được gửi đến API qua `memoServiceClient.listMemos()`
7. ✅ API trả về memos của ngày hôm nay

**Điểm mạnh:**
- ✅ Tự động filter theo ngày hôm nay khi vào trang Home
- ✅ URL có thể bookmark/share
- ✅ Xử lý timezone đúng (UTC)
- ✅ Hỗ trợ cả `created_ts` và `updated_ts` tùy setting

**Lưu ý:**
- Filter chỉ được set tự động nếu URL chưa có filter nào
- Nếu user đã có filter trong URL, sẽ không override

