import { apiFetch, apiPatchJson, apiPostJson, type ApiSettings } from "@govoplan/core-webui"; export type OrganizationUnitTypeItem = { id: string; tenant_id: string; slug: string; name: string; description?: string | null; is_active: boolean; settings: Record; created_at: string; updated_at: string; }; export type OrganizationStructureKind = "hierarchy" | "network" | "membership" | "classification"; export type OrganizationAuditDetailLevel = "summary" | "standard" | "full"; export type OrganizationSettingsItem = { id?: string | null; tenant_id: string; allow_tenant_model_customization: boolean; require_model_change_requests: boolean; audit_detail_level: OrganizationAuditDetailLevel; change_retention_days?: number | null; settings: Record; created_at?: string | null; updated_at?: string | null; }; export type OrganizationSettingsUpdatePayload = { allow_tenant_model_customization?: boolean; require_model_change_requests?: boolean; audit_detail_level?: OrganizationAuditDetailLevel; change_retention_days?: number | null; settings?: Record; }; export type OrganizationStructureItem = { id: string; tenant_id: string; slug: string; name: string; description?: string | null; structure_kind: OrganizationStructureKind | string; is_active: boolean; settings: Record; created_at: string; updated_at: string; }; export type OrganizationRelationTypeItem = { id: string; tenant_id: string; structure_id?: string | null; slug: string; name: string; description?: string | null; source_unit_type_id?: string | null; target_unit_type_id?: string | null; is_hierarchical: boolean; allow_cycles: boolean; is_active: boolean; settings: Record; created_at: string; updated_at: string; }; 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 OrganizationRelationItem = { id: string; tenant_id: string; structure_id: string; relation_type_id: string; source_unit_id: string; target_unit_id: string; valid_from?: string | null; valid_until?: string | null; is_active: boolean; settings: Record; created_at: string; updated_at: string; }; export type OrganizationFunctionTypeItem = { id: string; tenant_id: string; slug: string; name: string; description?: string | null; organization_unit_type_id?: string | null; delegable: boolean; act_in_place_allowed: boolean; 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 = { unit_types: OrganizationUnitTypeItem[]; structures: OrganizationStructureItem[]; relation_types: OrganizationRelationTypeItem[]; units: OrganizationUnitItem[]; relations: OrganizationRelationItem[]; function_types: OrganizationFunctionTypeItem[]; functions: OrganizationFunctionItem[]; }; export type OrganizationTemplateVersion = { id: string; template_id: string; version: string; status: string; definition_sha256: string; release_notes?: string | null; published_at?: string | null; }; export type OrganizationTemplateCatalogItem = { id: string; slug: string; name: string; description?: string | null; versions: OrganizationTemplateVersion[]; }; export type OrganizationTemplateCatalog = { templates: OrganizationTemplateCatalogItem[]; }; export type OrganizationModelInstantiation = { id: string; tenant_id: string; template_id: string; template_version_id: string; source_definition_sha256: string; status: string; object_counts: Record; provenance: Record; created_at: string; updated_at: string; }; export type OrganizationUpgradeDecisionAction = "keep_local" | "use_target" | "map_to"; export type OrganizationUpgradeDiffEntry = { id: string; collection: string; key: string; classification: string; requires_decision: boolean; base?: Record | null; local?: Record | null; target?: Record | null; allowed_actions: OrganizationUpgradeDecisionAction[]; }; export type OrganizationModelUpgrade = { id: string; tenant_id: string; template_id: string; source_instantiation_id: string; source_template_version_id: string; target_template_version_id: string; status: string; revision: number; preview: { entries: OrganizationUpgradeDiffEntry[]; counts: Record; requires_decisions: number; blocking_invalid_references: number; silent_mutation: boolean; }; decisions: Record; created_at: string; updated_at: string; }; export type OrganizationModelUpgradeList = { current_instantiation?: OrganizationModelInstantiation | null; upgrades: OrganizationModelUpgrade[]; }; export type OrganizationChangeRequestPayload = { change_request_id?: string | null; }; export type SluggedCreatePayload = { slug?: string | null; name: string; description?: string | null; is_active?: boolean; settings?: Record; } & OrganizationChangeRequestPayload; export type StructureCreatePayload = SluggedCreatePayload & { structure_kind: OrganizationStructureKind; }; export type RelationTypeCreatePayload = SluggedCreatePayload & { structure_id?: string | null; source_unit_type_id?: string | null; target_unit_type_id?: string | null; is_hierarchical: boolean; allow_cycles: boolean; }; export type UnitCreatePayload = SluggedCreatePayload & { unit_type_id?: string | null; parent_id?: string | null; }; export type RelationCreatePayload = { structure_id: string; relation_type_id: string; source_unit_id: string; target_unit_id: string; is_active?: boolean; settings?: Record; } & OrganizationChangeRequestPayload; export type FunctionTypeCreatePayload = SluggedCreatePayload & { organization_unit_type_id?: string | null; delegable: boolean; act_in_place_allowed: boolean; }; export type FunctionCreatePayload = SluggedCreatePayload & { organization_unit_id: string; function_type_id?: string | null; delegable?: boolean | null; act_in_place_allowed?: boolean | null; }; export function getOrganizationModel(settings: ApiSettings): Promise { return apiFetch(settings, "/api/v1/organizations/model"); } export function getOrganizationTemplateCatalog(settings: ApiSettings): Promise { return apiFetch(settings, "/api/v1/organizations/model-templates"); } export function getOrganizationModelUpgrades(settings: ApiSettings): Promise { return apiFetch(settings, "/api/v1/organizations/model-upgrades"); } export function previewOrganizationModelUpgrade(settings: ApiSettings, targetTemplateVersionId: string): Promise { return apiPostJson(settings, "/api/v1/organizations/model-upgrades/preview", { target_template_version_id: targetTemplateVersionId, idempotency_key: crypto.randomUUID() }); } export function cancelOrganizationModelUpgrade(settings: ApiSettings, upgradeId: string, expectedRevision: number): Promise { return apiPostJson(settings, `/api/v1/organizations/model-upgrades/${encodeURIComponent(upgradeId)}/cancel`, { expected_revision: expectedRevision }); } export function applyOrganizationModelUpgrade( settings: ApiSettings, upgradeId: string, expectedRevision: number, decisions: Record, changeRequestId?: string ): Promise<{ upgrade: OrganizationModelUpgrade; instantiation: OrganizationModelInstantiation }> { return apiPostJson(settings, `/api/v1/organizations/model-upgrades/${encodeURIComponent(upgradeId)}/apply`, { expected_revision: expectedRevision, decisions, change_request_id: changeRequestId || null }); } export function getOrganizationSettings(settings: ApiSettings): Promise { return apiFetch(settings, "/api/v1/organizations/settings"); } export function patchOrganizationSettings(settings: ApiSettings, payload: OrganizationSettingsUpdatePayload): Promise { return apiPatchJson(settings, "/api/v1/organizations/settings", payload); } export function createUnitType(settings: ApiSettings, payload: SluggedCreatePayload): Promise { return apiPostJson(settings, "/api/v1/organizations/unit-types", payload); } export function patchUnitType(settings: ApiSettings, id: string, payload: Partial): Promise { return apiPatchJson(settings, `/api/v1/organizations/unit-types/${encodeURIComponent(id)}`, payload); } export function createStructure(settings: ApiSettings, payload: StructureCreatePayload): Promise { return apiPostJson(settings, "/api/v1/organizations/structures", payload); } export function patchStructure(settings: ApiSettings, id: string, payload: Partial): Promise { return apiPatchJson(settings, `/api/v1/organizations/structures/${encodeURIComponent(id)}`, payload); } export function createRelationType(settings: ApiSettings, payload: RelationTypeCreatePayload): Promise { return apiPostJson(settings, "/api/v1/organizations/relation-types", payload); } export function patchRelationType(settings: ApiSettings, id: string, payload: Partial): Promise { return apiPatchJson(settings, `/api/v1/organizations/relation-types/${encodeURIComponent(id)}`, payload); } export function createUnit(settings: ApiSettings, payload: UnitCreatePayload): Promise { return apiPostJson(settings, "/api/v1/organizations/units", payload); } export function patchUnit(settings: ApiSettings, id: string, payload: Partial): Promise { return apiPatchJson(settings, `/api/v1/organizations/units/${encodeURIComponent(id)}`, payload); } export function createRelation(settings: ApiSettings, payload: RelationCreatePayload): Promise { return apiPostJson(settings, "/api/v1/organizations/relations", payload); } export function patchRelation(settings: ApiSettings, id: string, payload: Partial): Promise { return apiPatchJson(settings, `/api/v1/organizations/relations/${encodeURIComponent(id)}`, payload); } export function createFunctionType(settings: ApiSettings, payload: FunctionTypeCreatePayload): Promise { return apiPostJson(settings, "/api/v1/organizations/function-types", payload); } export function patchFunctionType(settings: ApiSettings, id: string, payload: Partial): Promise { return apiPatchJson(settings, `/api/v1/organizations/function-types/${encodeURIComponent(id)}`, payload); } export function createFunction(settings: ApiSettings, payload: FunctionCreatePayload): Promise { return apiPostJson(settings, "/api/v1/organizations/functions", payload); } export function patchFunction(settings: ApiSettings, id: string, payload: Partial): Promise { return apiPatchJson(settings, `/api/v1/organizations/functions/${encodeURIComponent(id)}`, payload); }