import { z } from "zod";

export const authorizationRecordStatusSchema = z.enum([
  "valid",
  "missing",
  "rejected",
  "superseded",
]);

const dateOnlySchema = z
  .string()
  .trim()
  .optional()
  .nullable()
  .transform((value) => {
    if (!value) return null;
    return value.slice(0, 10);
  })
  .refine(
    (value) => value === null || /^\d{4}-\d{2}-\d{2}$/.test(value),
    "Invalid date"
  );

export const upsertAuthorizationRecordSchema = z.object({
  votingEntityId: z.string().uuid(),
  designatedVoterContactId: z.string().uuid().optional().nullable(),
  reasonRequired: z.string().trim().max(5000).optional().nullable(),
  documentFileUrl: z.string().trim().max(512).optional().nullable(),
  dateReceived: dateOnlySchema,
  effectiveDate: dateOnlySchema,
  expirationDate: dateOnlySchema,
  signedDate: dateOnlySchema,
  status: z.enum(["valid", "missing"]).default("valid"),
});

export const reviewAuthorizationRecordSchema = z
  .object({
    votingEntityId: z.string().uuid(),
    decision: z.enum(["approve", "reject"]),
    designatedVoterContactId: z.string().uuid().optional().nullable(),
    rejectionReason: z.string().trim().max(5000).optional().nullable(),
    effectiveDate: dateOnlySchema,
    expirationDate: dateOnlySchema,
  })
  .refine(
    (data) =>
      data.decision !== "reject" ||
      (data.rejectionReason != null && data.rejectionReason.trim().length > 0),
    {
      message: "Rejection reason is required when rejecting",
      path: ["rejectionReason"],
    }
  );

export type UpsertAuthorizationRecordInput = z.infer<
  typeof upsertAuthorizationRecordSchema
>;
export type ReviewAuthorizationRecordInput = z.infer<
  typeof reviewAuthorizationRecordSchema
>;
