import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { qk } from '../query/keys' import type { UUID } from '../types/domain' import type { BibliografiaUpsertInput, SubjectsCreateManualInput, SubjectsUpdateFieldsPatch, } from '../api/subjects.api' import { ai_generate_subject, subjects_bibliografia_list, subjects_clone_from_existing, subjects_create_manual, subjects_generate_document, subjects_get, subjects_get_document, subjects_history, subjects_import_from_file, subjects_persist_from_ai, subjects_update_bibliografia, subjects_update_contenido, subjects_update_fields, } from '../api/subjects.api' export function useSubject(subjectId: UUID | null | undefined) { return useQuery({ queryKey: subjectId ? qk.asignatura(subjectId) : ['asignaturas', 'detail', null], queryFn: () => subjects_get(subjectId as UUID), enabled: Boolean(subjectId), }) } export function useSubjectBibliografia(subjectId: UUID | null | undefined) { return useQuery({ queryKey: subjectId ? qk.asignaturaBibliografia(subjectId) : ['asignaturas', 'bibliografia', null], queryFn: () => subjects_bibliografia_list(subjectId as UUID), enabled: Boolean(subjectId), }) } export function useSubjectHistorial(subjectId: UUID | null | undefined) { return useQuery({ queryKey: subjectId ? qk.asignaturaHistorial(subjectId) : ['asignaturas', 'historial', null], queryFn: () => subjects_history(subjectId as UUID), enabled: Boolean(subjectId), }) } export function useSubjectDocumento(subjectId: UUID | null | undefined) { return useQuery({ queryKey: subjectId ? qk.asignaturaDocumento(subjectId) : ['asignaturas', 'documento', null], queryFn: () => subjects_get_document(subjectId as UUID), enabled: Boolean(subjectId), staleTime: 30_000, }) } /* ------------------ Mutations ------------------ */ export function useCreateSubjectManual() { const qc = useQueryClient() return useMutation({ mutationFn: (payload: SubjectsCreateManualInput) => subjects_create_manual(payload), onSuccess: (subject) => { qc.setQueryData(qk.asignatura(subject.id), subject) qc.invalidateQueries({ queryKey: qk.planAsignaturas(subject.plan_estudio_id), }) qc.invalidateQueries({ queryKey: qk.planHistorial(subject.plan_estudio_id), }) }, }) } export function useGenerateSubjectAI() { return useMutation({ mutationFn: ai_generate_subject }) } export function usePersistSubjectFromAI() { const qc = useQueryClient() return useMutation({ mutationFn: (payload: { planId: UUID; jsonMateria: any }) => subjects_persist_from_ai(payload), onSuccess: (subject) => { qc.setQueryData(qk.asignatura(subject.id), subject) qc.invalidateQueries({ queryKey: qk.planAsignaturas(subject.plan_estudio_id), }) qc.invalidateQueries({ queryKey: qk.planHistorial(subject.plan_estudio_id), }) }, }) } export function useCloneSubject() { const qc = useQueryClient() return useMutation({ mutationFn: subjects_clone_from_existing, onSuccess: (subject) => { qc.setQueryData(qk.asignatura(subject.id), subject) qc.invalidateQueries({ queryKey: qk.planAsignaturas(subject.plan_estudio_id), }) qc.invalidateQueries({ queryKey: qk.planHistorial(subject.plan_estudio_id), }) }, }) } export function useImportSubjectFromFile() { const qc = useQueryClient() return useMutation({ mutationFn: subjects_import_from_file, onSuccess: (subject) => { qc.setQueryData(qk.asignatura(subject.id), subject) qc.invalidateQueries({ queryKey: qk.planAsignaturas(subject.plan_estudio_id), }) qc.invalidateQueries({ queryKey: qk.planHistorial(subject.plan_estudio_id), }) }, }) } export function useUpdateSubjectFields() { const qc = useQueryClient() return useMutation({ mutationFn: (vars: { subjectId: UUID; patch: SubjectsUpdateFieldsPatch }) => subjects_update_fields(vars.subjectId, vars.patch), onSuccess: (updated) => { qc.setQueryData(qk.asignatura(updated.id), updated) qc.invalidateQueries({ queryKey: qk.planAsignaturas(updated.plan_estudio_id), }) qc.invalidateQueries({ queryKey: qk.asignaturaHistorial(updated.id) }) }, }) } export function useUpdateSubjectContenido() { const qc = useQueryClient() return useMutation({ mutationFn: (vars: { subjectId: UUID; unidades: any[] }) => subjects_update_contenido(vars.subjectId, vars.unidades), onSuccess: (updated) => { qc.setQueryData(qk.asignatura(updated.id), updated) qc.invalidateQueries({ queryKey: qk.asignaturaHistorial(updated.id) }) }, }) } export function useUpdateSubjectBibliografia() { const qc = useQueryClient() return useMutation({ mutationFn: (vars: { subjectId: UUID; entries: BibliografiaUpsertInput }) => subjects_update_bibliografia(vars.subjectId, vars.entries), onSuccess: (_ok, vars) => { qc.invalidateQueries({ queryKey: qk.asignaturaBibliografia(vars.subjectId), }) qc.invalidateQueries({ queryKey: qk.asignaturaHistorial(vars.subjectId) }) }, }) } export function useGenerateSubjectDocumento() { const qc = useQueryClient() return useMutation({ mutationFn: (subjectId: UUID) => subjects_generate_document(subjectId), onSuccess: (_doc, subjectId) => { qc.invalidateQueries({ queryKey: qk.asignaturaDocumento(subjectId) }) qc.invalidateQueries({ queryKey: qk.asignaturaHistorial(subjectId) }) }, }) }