import apiClient from './client' import type { Session, SessionCreate, SessionUpdate, SessionExport, SaveAsTreeRequest, SaveAsTreeResponse, SessionComplete, RedactionSummary, SessionShareCreate, SessionShare, SharedSessionView, PrepareSessionRequest } from '@/types' export interface SessionListParams { page?: number size?: number tree_id?: string batch_id?: string completed?: boolean assigned_to_id?: string status?: 'prepared' | 'active' | 'completed' ticket_number?: string client_name?: string tree_name?: string started_after?: string // ISO datetime string started_before?: string completed_after?: string completed_before?: string } export const sessionsApi = { async list(params?: SessionListParams): Promise { const response = await apiClient.get('/sessions', { params }) return response.data }, async get(id: string): Promise { const response = await apiClient.get(`/sessions/${id}`) return response.data }, async create(data: SessionCreate): Promise { const response = await apiClient.post('/sessions', data) window.dispatchEvent(new Event('session-changed')) return response.data }, async update(id: string, data: SessionUpdate): Promise { const response = await apiClient.put(`/sessions/${id}`, data) return response.data }, async complete(id: string, data: SessionComplete): Promise { const response = await apiClient.post(`/sessions/${id}/complete`, data) window.dispatchEvent(new Event('session-changed')) return response.data }, async export(id: string, options: SessionExport): Promise { const response = await apiClient.post(`/sessions/${id}/export`, options) return response.data }, async exportWithMeta( id: string, options: SessionExport ): Promise<{ content: string redactionMode: 'none' | 'mask' redactionSummary: RedactionSummary | null }> { const response = await apiClient.post(`/sessions/${id}/export`, options) const redactionMode = (response.headers['x-redaction-mode'] as 'none' | 'mask') || 'none' let redactionSummary: RedactionSummary | null = null const summaryHeader = response.headers['x-redaction-summary'] if (summaryHeader) { try { redactionSummary = JSON.parse(summaryHeader) } catch { // Ignore malformed header } } return { content: response.data, redactionMode, redactionSummary } }, async prepare(data: PrepareSessionRequest): Promise { const response = await apiClient.post('/sessions/prepare', data) return response.data }, async updateVariables(id: string, variables: Record): Promise { const response = await apiClient.patch(`/sessions/${id}/variables`, { variables }) return response.data }, async updateScratchpad(id: string, content: string): Promise { const response = await apiClient.patch(`/sessions/${id}/scratchpad`, { scratchpad: content }) return response.data }, async saveAsTree(id: string, data: SaveAsTreeRequest): Promise { const response = await apiClient.post(`/sessions/${id}/save-as-tree`, data) return response.data }, // Session Sharing async createShare(sessionId: string, data: SessionShareCreate): Promise { const response = await apiClient.post(`/sessions/${sessionId}/shares`, data) return response.data }, async listMyShares(): Promise { const response = await apiClient.get('/shares/my-shares') return response.data }, async revokeShare(shareId: string): Promise { await apiClient.delete(`/shares/${shareId}`) }, async getSharedSession(shareToken: string): Promise { const response = await apiClient.get(`/share/${shareToken}`) return response.data }, } export default sessionsApi