import type { User, UserStats, CreateUserPayload, UpdateUserPayload } from "@/domain/entities/user";
import type { GenerateMcpTokenPayload, McpCredential, McpTokenResult } from "@/domain/entities/mcp-token";
import type { UserRepository } from "@/domain/repositories/user.repository";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";
import { api } from "@/infrastructure/api/api-client";

export class UserRepositoryImpl implements UserRepository {
  findAll(params: PaginationQueryParams) {
    return api.get<BackendPaginatedData<User>>("/users", { params });
  }

  findById(id: number) {
    return api.get<User>(`/users/${id}`);
  }

  create(payload: CreateUserPayload) {
    return api.post<User>("/users", payload);
  }

  update(id: number, payload: UpdateUserPayload) {
    return api.put<User>(`/users/${id}`, payload);
  }

  delete(id: number) {
    return api.delete(`/users/${id}`);
  }

  toggleStatus(id: number) {
    return api.post<void>(`/users/${id}/toggle-status`);
  }

  verifyEmail(id: number) {
    return api.post<void>(`/users/${id}/verify-email`);
  }

  resetPassword(id: number, password: string) {
    return api.post<void>(`/users/${id}/reset-password`, { password });
  }

  impersonate(id: number) {
    return api.post<{ token: string }>(`/users/${id}/impersonate`);
  }

  generateMcpToken(id: number, payload?: GenerateMcpTokenPayload) {
    return api.post<McpTokenResult>(`/users/${id}/mcp-token`, payload);
  }

  listMcpTokens(id: number) {
    return api.get<McpCredential[]>(`/users/${id}/mcp-tokens`);
  }

  revokeMcpToken(id: number, credentialId: number) {
    return api.delete(`/users/${id}/mcp-tokens/${credentialId}`);
  }

  getStats() {
    return api.get<UserStats>("/users/stats");
  }
}
