import { useMutation, useSuspenseQuery } from '@tanstack/react-query'
import { Link, useNavigate } from '@tanstack/react-router'
import { api, json, read } from '../../../shared/api.ts'
import { messageOf } from '../../../shared/errors.ts'
import { formKey, useAppForm } from '../../../shared/form.tsx'
import { ArrowLeftIcon } from '../../../shared/icons.tsx'
import {
backLink,
Callout,
ConfirmButton,
SaveBar,
SettingRow,
SettingsGroup,
SettingsPage,
} from '../../../shared/ui/SettingsPage.tsx'
import { capabilities } from '../../models/capabilities.ts'
import { RolePicker } from '../components/RolePicker.tsx'
import { useModelsChanged } from '../hooks/changes.ts'
import { type AdminModel, storedModel } from '../lib/models.ts'
import { rolesWithUser } from '../lib/roles.ts'
import { adminModelsQuery, adminRolesQuery } from '../queries.ts'
interface ModelAdminProps {
pluginId: string
provider: string
modelId: string
}
/** One of a plugin's admin models on its own page. */
export function ModelAdmin(props: ModelAdminProps) {
const { data: models } = useSuspenseQuery(adminModelsQuery)
const { data: roles } = useSuspenseQuery(adminRolesQuery)
const navigate = useNavigate()
const modelsChanged = useModelsChanged()
const save = useMutation({
mutationFn: (model: AdminModel) => read(api.admin.models.$put({}, json(model))),
onSuccess: modelsChanged,
})
const remove = useMutation({
mutationFn: () =>
read(api.admin.models.$delete({}, json({ provider: props.provider, id: props.modelId }))),
// Leave first, so the page doesn't say the model it just removed isn't offered.
onSuccess: async () => {
await navigate({ to: '/admin/plugins/$id', params: { id: props.pluginId } })
await modelsChanged()
},
})
const model = models.find(
(candidate) => candidate.provider === props.provider && candidate.id === props.modelId,
)
const back = (
This model isn't offered. {model.warning}