import { z } from "zod"
import {
	barcodeTypeSchema,
	cssMediaTypeSchema,
	horizontalAlignmentSchema,
	lengthSchema,
	verticalAlignmentSchema
} from "./typeSchema";
import {BarcodeStampOptions, TextStampOptions} from "../../public/stamp";

export const baseStampOptionsSchema = z.object({
  horizontalAlignment: horizontalAlignmentSchema,
  verticalAlignment: verticalAlignmentSchema,
  horizontalOffset: lengthSchema.optional(),
  verticalOffset: lengthSchema.optional(),
  opacity: z
    .number()
    .optional(),
  rotation: z
    .number()
    .optional(),
  hyperlink: z
    .string()
    .optional(),
  scale: z
    .number()
    .optional(),
  behindExistingContent: z
    .boolean()
    .optional(),
  timeout: z
    .number()
    .optional(),
  renderDelay: z
    .number()
    .optional(),
  maxWidth: lengthSchema.optional(),
  maxHeight: lengthSchema.optional(),
  minWidth: lengthSchema.optional(),
  minHeight: lengthSchema.optional()
})

export const htmlStampOptionsSchema = baseStampOptionsSchema.extend({
  cssMediaType: cssMediaTypeSchema.optional()
})

export const imageStampOptionsSchema = baseStampOptionsSchema

export const barcodeStampOptionsSchema: z.ZodType<BarcodeStampOptions> = baseStampOptionsSchema.extend({
  widthPx: z
    .number()
    .optional(),
  heightPx: z
    .number()
    .optional(),
  barcodeType: barcodeTypeSchema.optional()
})

export const textStampOptionsSchema: z.ZodType<TextStampOptions> = baseStampOptionsSchema.extend({
  isBold: z
    .boolean()
    .optional(),
  isItalic: z
    .boolean()
    .optional(),
  isUnderline: z
    .boolean()
    .optional(),
  isStrikethrough: z
    .boolean()
    .optional(),
  fontFamily: z
    .string()
    .optional(),
  fontSize: z
    .number()
    .optional(),
  useGoogleFont: z
    .boolean()
    .optional(),
  textColor: z
    .string()
    .optional(),
  backgroundColor: z
    .string()
    .optional()
})
