import { z } from 'zod';

/**
 * Vendor-attributed SLA (2026-06-02): /api/vendors body validation.
 */
const noControlChars = (val: string) => !/[\r\n\t\0]/.test(val);
const noControlCharsMsg = 'Control characters (CR, LF, tab, NUL) are not allowed';

export const createVendorSchema = z.object({
    name: z.string().min(1, 'Vendor name is required').max(120).refine(noControlChars, noControlCharsMsg),
    // Contracted uptime percent: 0 < x <= 100. e.g. 99.9.
    promisedUptime: z.coerce.number().gt(0, 'Promised uptime must be > 0').max(100, 'Promised uptime cannot exceed 100'),
    contractRef: z.string().max(191).refine(noControlChars, noControlCharsMsg).optional().nullable(),
    creditTerms: z.string().max(191).refine(noControlChars, noControlCharsMsg).optional().nullable(),
    notes: z.string().max(5000).optional().nullable(),
});

// All fields optional for PATCH/PUT edits.
export const updateVendorSchema = createVendorSchema.partial();

export const assignMonitorsSchema = z.object({
    monitorIds: z.array(z.coerce.number().int().positive()).max(1000),
});

export type CreateVendorInput = z.infer<typeof createVendorSchema>;
export type UpdateVendorInput = z.infer<typeof updateVendorSchema>;
export type AssignMonitorsInput = z.infer<typeof assignMonitorsSchema>;
