import { apiFetch, type ApiSettings } from "@govoplan/core-webui"; export type OrganizationUnitItem = { id: string; tenant_id: string; unit_type_id?: string | null; parent_id?: string | null; slug: string; name: string; description?: string | null; is_active: boolean; settings: Record; created_at: string; updated_at: string; }; export type OrganizationFunctionItem = { id: string; tenant_id: string; function_type_id?: string | null; organization_unit_id: string; slug: string; name: string; description?: string | null; delegable: boolean; act_in_place_allowed: boolean; is_active: boolean; settings: Record; created_at: string; updated_at: string; }; export type OrganizationModel = { units: OrganizationUnitItem[]; functions: OrganizationFunctionItem[]; }; export type IdentityOption = { id: string; display_name?: string | null; external_subject?: string | null; source: string; primary_account_id?: string | null; account_ids: string[]; status: string; }; export type IdentityListResponse = { identities: IdentityOption[]; }; export type OrganizationFunctionAssignmentItem = { id: string; tenant_id: string; identity_id: string; account_id?: string | null; function_id: string; organization_unit_id: string; applies_to_subunits: boolean; source: string; delegated_from_assignment_id?: string | null; acting_for_account_id?: string | null; valid_from?: string | null; valid_until?: string | null; is_active: boolean; settings: Record; created_at: string; updated_at: string; }; export type OrganizationFunctionAssignmentList = { assignments: OrganizationFunctionAssignmentItem[]; }; export type IdmSettings = { tenant_id: string; require_assignment_change_requests: boolean; audit_detail_level: "summary" | "standard" | "full"; change_retention_days?: number | null; settings: Record; created_at?: string | null; updated_at?: string | null; }; export type OrganizationFunctionAssignmentPayload = { identity_id: string; function_id: string; account_id?: string | null; applies_to_subunits?: boolean; source?: string; delegated_from_assignment_id?: string | null; acting_for_account_id?: string | null; valid_from?: string | null; valid_until?: string | null; is_active?: boolean; settings?: Record; change_request_id?: string | null; }; export type IdmSettingsPayload = Partial>; function post>(settings: ApiSettings, path: string, payload: P): Promise { return apiFetch(settings, path, { method: "POST", body: JSON.stringify(payload) }); } function patch>(settings: ApiSettings, path: string, payload: P): Promise { return apiFetch(settings, path, { method: "PATCH", body: JSON.stringify(payload) }); } export function getOrganizationModel(settings: ApiSettings): Promise { return apiFetch(settings, "/api/v1/organizations/model"); } export function getOrganizationFunctionAssignments(settings: ApiSettings): Promise { return apiFetch(settings, "/api/v1/idm/organization-function-assignments"); } export function getIdmSettings(settings: ApiSettings): Promise { return apiFetch(settings, "/api/v1/idm/settings"); } export function patchIdmSettings(settings: ApiSettings, payload: IdmSettingsPayload): Promise { return patch(settings, "/api/v1/idm/settings", payload); } export function searchOrganizationIdentityOptions(settings: ApiSettings, query = "", limit = 50): Promise { const params = new URLSearchParams(); const trimmed = query.trim(); if (trimmed) params.set("query", trimmed); params.set("limit", String(limit)); return apiFetch(settings, `/api/v1/idm/organization-identities?${params.toString()}`); } export function createOrganizationFunctionAssignment( settings: ApiSettings, payload: OrganizationFunctionAssignmentPayload ): Promise { return post(settings, "/api/v1/idm/organization-function-assignments", payload); } export function patchOrganizationFunctionAssignment( settings: ApiSettings, id: string, payload: Partial ): Promise { return patch(settings, `/api/v1/idm/organization-function-assignments/${encodeURIComponent(id)}`, payload); }