import { API_BASE_URL } from "@config/config_frontend"; export interface DashboardUser { id: number; email: string; name: string; position?: string | null; department?: string | null; phone?: string | null; company_id?: number | null; company_name?: string | null; role: "SYSTEM_ADMIN" | "ADMIN" | "USER"; is_master: boolean; status: string; } export interface ProjectItem { id: string; name: string; region?: string | null; status?: string | null; owner_name?: string | null; workflow_stage: number; progress_percent: number; updated_at?: string | null; } export interface CompanyInfo { id: number; name: string; business_registration_number?: string | null; business_address?: string | null; business_owner?: string | null; business_status?: string | null; user_count?: number; project_count?: number; } export interface Member { id: number; email: string; name: string; position?: string | null; department?: string | null; role: string; status: string; } export interface JoinRequest { id: number; user_id: number; company_id: number; user_email: string; user_name?: string | null; company_name?: string | null; requested_at: string; status: string; } export interface AuditLog { id: number; user_id: number; email?: string | null; action: string; resource_type?: string | null; resource_id?: number | null; timestamp: string; } export interface ResourceData { current: { cpu_usage_percent: number | null; memory_usage_percent: number | null; disk_usage_percent: number | null; active_user_count: number; active_project_count: number; total_storage_mb: number; }; history: unknown[]; stats: ResourceData["current"]; } export interface UpdateUserRequest { name: string; position?: string | null; department?: string | null; phone?: string | null; } export interface CreateCompanyRequest { name: string; business_registration_number: string; business_address?: string | null; business_owner?: string | null; } async function request(path: string, init: RequestInit = {}): Promise { const response = await fetch(`${API_BASE_URL}${path}`, { credentials: "include", headers: { "Content-Type": "application/json", ...(init.headers ?? {}) }, ...init, }); const data = (await response.json()) as { detail?: string } & T; if (!response.ok) throw new Error(data.detail ?? "Request failed"); return data; } const body = (value: object): string => JSON.stringify(value); export async function fetchDashboardMe(): Promise { const data = await request<{ user: DashboardUser }>("/dashboard/me"); return data.user; } export async function updateUserProfile(payload: UpdateUserRequest): Promise { const data = await request<{ user: DashboardUser }>("/dashboard/me", { method: "PATCH", body: body(payload), }); return data.user; } export async function fetchUserProjects(): Promise { const data = await request<{ projects: ProjectItem[] }>("/dashboard/user/projects"); return data.projects; } export async function fetchUserCompany(): Promise { const data = await request<{ company: CompanyInfo | null }>("/dashboard/user/company"); return data.company; } export async function searchCompanies(query: string): Promise { const data = await request<{ companies: CompanyInfo[] }>( `/dashboard/user/companies?q=${encodeURIComponent(query)}`, ); return data.companies; } export function createCompany(payload: CreateCompanyRequest): Promise { return request("/dashboard/user/company/create", { method: "POST", body: body(payload) }); } export function joinCompany(companyId: number): Promise { return request("/dashboard/user/company/join", { method: "POST", body: body({ company_id: companyId }), }); } export async function fetchCompanyMembers(): Promise { const data = await request<{ members: Member[] }>("/dashboard/admin/members"); return data.members; } export function addCompanyMember(email: string): Promise { return request("/dashboard/admin/members", { method: "POST", body: body({ email }) }); } export function removeCompanyMember(userId: number): Promise { return request(`/dashboard/admin/members/${userId}`, { method: "DELETE" }); } export async function fetchCompanyJoinRequests(): Promise { const data = await request<{ requests: JoinRequest[] }>("/dashboard/admin/join-requests"); return data.requests; } export function processJoinRequest( requestId: number, action: "APPROVE" | "REJECT", ): Promise { return request(`/dashboard/admin/join-requests/${requestId}`, { method: "PATCH", body: body({ action }), }); } export async function fetchCompanyProjects(): Promise { const data = await request<{ projects: ProjectItem[] }>("/dashboard/admin/projects"); return data.projects; } export async function fetchAllCompanies(): Promise { const data = await request<{ companies: CompanyInfo[] }>("/dashboard/admin/companies"); return data.companies; } export async function fetchAllUsers(): Promise { const data = await request<{ users: DashboardUser[] }>("/dashboard/admin/users"); return data.users; } export function changeUserRole(userId: number, role: string): Promise { return request(`/dashboard/admin/users/${userId}/role`, { method: "PATCH", body: body({ role }), }); } export function assignUserToCompany(userId: number, companyId: number | null): Promise { return request(`/dashboard/admin/users/${userId}/company`, { method: "PATCH", body: body({ company_id: companyId }), }); } export async function fetchAllJoinRequests(): Promise { const data = await request<{ requests: JoinRequest[] }>("/dashboard/admin/join-requests-all"); return data.requests; } export function systemApproveJoinRequest(requestId: number): Promise { return request(`/dashboard/admin/join-requests/${requestId}/approve`, { method: "PATCH" }); } export async function fetchAuditLogs(): Promise { const data = await request<{ items: AuditLog[] }>("/dashboard/admin/audit-logs"); return data.items; } export async function fetchSystemResources(period = "24h"): Promise { return request(`/dashboard/admin/resources?period=${encodeURIComponent(period)}`); }