'use client'; import { useState } from 'react'; import axios from 'axios'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { NumberingTemplate, numberingApi } from '@/lib/api/numbering'; import { Badge } from '@/components/ui/badge'; import { Loader2 } from 'lucide-react'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { useOrganizations, useCorrespondenceTypes, useDisciplines, useContracts } from '@/hooks/use-master-data'; import { Organization } from '@/types/organization'; import { Contract, getContractPublicId } from '@/types/contract'; // Local interfaces for Master Data since centralized ones are missing/fragmented interface CorrespondenceType { id: number; typeCode: string; typeName: string; } interface Discipline { id: number; disciplineCode: string; } interface TemplateTesterProps { open: boolean; onOpenChange: (open: boolean) => void; template: NumberingTemplate | null; } export function TemplateTester({ open, onOpenChange, template }: TemplateTesterProps) { const [testData, setTestData] = useState({ originatorId: '', recipientId: '', correspondenceTypeId: '', disciplineId: '', year: new Date().getFullYear(), }); const [testResult, setTestResult] = useState<{ number: string; isDefault?: boolean } | null>(null); const [loading, setLoading] = useState(false); // Master Data Hooks const templateWithProject = template as (NumberingTemplate & { project?: { id?: number; uuid?: string } }) | null; const projectId = templateWithProject?.project?.id ?? templateWithProject?.project?.uuid ?? template?.projectId ?? 1; const { data: organizations } = useOrganizations({ isActive: true }); const { data: correspondenceTypes } = useCorrespondenceTypes(); const { data: contractsData } = useContracts(projectId); const contracts = (Array.isArray(contractsData) ? contractsData : []) as Contract[]; // Use first contract ID for disciplines, fallback to 1 or undefined const contractId = getContractPublicId(contracts[0]); const { data: disciplines } = useDisciplines(contractId); const handleGenerate = async () => { if (!template) return; setLoading(true); setTestResult(null); try { const payload = { projectId: projectId, originatorOrganizationId: testData.originatorId || '0', recipientOrganizationId: testData.recipientId || '0', correspondenceTypeId: Number(testData.correspondenceTypeId || '0'), disciplineId: Number(testData.disciplineId || '0'), year: testData.year, }; const result = await numberingApi.previewNumber(payload); setTestResult({ number: result.previewNumber, isDefault: result.isDefault, }); } catch (error: unknown) { let errMsg = 'Unknown error'; if (axios.isAxiosError(error)) { errMsg = error.response?.data?.message || error.message; } else if (error instanceof Error) { errMsg = error.message; } setTestResult({ number: `Error: ${errMsg}`, isDefault: false }); } finally { setLoading(false); } }; return ( Test Number Generation
Template: {template?.formatTemplate}

Template Tester

Test Parameters

{/* Originator */}
{/* Recipient */}
{/* Document Type */}
{/* Discipline */}

Format Preview: {template?.formatTemplate}

{testResult && (

{(testResult.number || '').startsWith('Error:') ? 'Generation Failed:' : 'Generated Number:'}

{testResult.isDefault && !(testResult.number || '').startsWith('Error:') && ( Default Template )} {!testResult.isDefault && !(testResult.number || '').startsWith('Error:') && ( Specific Template )}
{testResult.number || (
Empty Result. Raw: {JSON.stringify(testResult, null, 2)}
)}
)}
); }