import APIClient
import ComposableArchitecture
import Foundation

@DependencyClient
public struct WorkspacesClient {
    public var getMyWorkspaces: @Sendable (_ page: Int, _ query: String?) async throws -> WorkspacesPage
    public var trashWorkspace: @Sendable (_ workspaceId: String) async throws -> Void
}

extension WorkspacesClient: DependencyKey {
    public static let liveValue: Self = {
        @Dependency(\.apiClientV2) var apiClient
        
        return Self(
            getMyWorkspaces: { page, query in
                try await apiClient.getMyWorkspaces(page, query)
            },
            trashWorkspace: { workspaceId in
                try await apiClient.trashWorkspace(workspaceId, nil)
            }
        )
    }()
    
    public static let testValue = WorkspacesClient(
        getMyWorkspaces: { _, _ in
            WorkspacesPage(
                currentPage: 0,
                totalResults: 0,
                workspaces: []
            )
        },
        trashWorkspace: { _ in }
    )
    
    public static let previewValue = WorkspacesClient(
        getMyWorkspaces: { page, _ in
            WorkspacesPage(
                currentPage: page,
                totalResults: 5,
                workspaces: [
                    Workspace(
                        id: "sample-1",
                        name: "My Workspace",
                        description: "",
                        clipCount: 15,
                        createdAt: Date().addingTimeInterval(-120),
                        lastUpdatedClip: Date().addingTimeInterval(-120),
                        ownerId: nil,
                        shared: false
                    ),
                    Workspace(
                        id: "sample-2",
                        name: "Abbot Kinney Beats",
                        description: "",
                        clipCount: 10,
                        createdAt: Date().addingTimeInterval(-7200),
                        lastUpdatedClip: Date().addingTimeInterval(-7200),
                        ownerId: nil,
                        shared: false
                    ),
                    Workspace(
                        id: "sample-3",
                        name: "NYC Beats",
                        description: "",
                        clipCount: 3,
                        createdAt: Date().addingTimeInterval(-172800),
                        lastUpdatedClip: Date().addingTimeInterval(-172800),
                        ownerId: nil,
                        shared: false
                    )
                ]
            )
        },
        trashWorkspace: { _ in }
    )
}

extension DependencyValues {
    public var workspacesClient: WorkspacesClient {
        get { self[WorkspacesClient.self] }
        set { self[WorkspacesClient.self] = newValue }
    }
}

