import { z } from 'zod';

export const UserFullSchema = z.object({
  id: z
    .string()
    .regex(
      new RegExp(
        "^[0-9a-f]{8}-[0-9a-f]{4}-[45][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
      ),
    )
    .describe("Unique identifier (UUID v4 or v5 format)"),
  legacyId: z
    .string()
    .max(50)
    .describe("Legacy system unique identifier for backward compatibility")
    .optional(),
  createdAt: z
    .number()
    .int()
    .gte(1)
    .describe("Unix timestamp of creation date"),
  updatedAt: z.number().int().gte(1).describe("Unix timestamp of last update"),
  system: z
    .object({})
    .catchall(z.any())
    .describe("System-managed settings for internal classification")
    .optional(),
  name: z
    .string()
    .min(1)
    .max(255)
    .describe("Name of the template (1-255 characters)"),
  urlName: z
    .string()
    .max(255)
    .describe("URL-friendly name (optional, max 255 characters)")
    .optional(),
  description: z
    .string()
    .max(3000)
    .describe(
      "Detailed description of the template (optional, max 3000 characters)",
    )
    .optional(),
  imageUrl: z
    .string()
    .max(255)
    .describe("URL to the template's primary image")
    .optional(),
  backgroundImageUrl: z
    .string()
    .max(255)
    .describe("URL to the template's background image")
    .optional(),
  visibility: z
    .object({})
    .catchall(z.any())
    .describe("Conditions that determine template visibility")
    .optional(),
  settings: z
    .object({})
    .catchall(z.any())
    .describe("Template-specific settings")
    .optional(),
  searchTags: z
    .array(z.string().max(50))
    .max(20)
    .describe("Tags used for template search functionality")
    .optional(),
  categoryTags: z
    .array(z.string().max(30))
    .max(10)
    .describe("Category classification tags")
    .optional(),
  guilds: z
    .array(
      z.object({
        guildId: z
          .string()
          .describe("The ID of the guild the member belongs to")
          .optional(),
        roles: z
          .array(
            z.object({
              roleId: z
                .string()
                .regex(
                  new RegExp(
                    "^[0-9a-f]{8}-[0-9a-f]{4}-[45][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
                  ),
                )
                .describe("Roles assigned to the user")
                .optional(),
            }),
          )
          .optional(),
        joinedAt: z
          .number()
          .int()
          .describe("Timestamp of when the member joined the guild")
          .optional(),
        lastActive: z
          .number()
          .int()
          .describe("Timestamp of when the member was last active in the guild")
          .optional(),
      }),
    )
    .optional(),
  identities: z
    .array(
      z
        .object({
          identityId: z.string().describe("The ID of the identity").optional(),
        })
        .catchall(z.any()),
    )
    .optional(),
  farcaster: z
    .array(
      z.object({
        fid: z.string().describe("The Farcaster ID"),
        username: z.string().describe("Farcaster username").optional(),
        avatar: z.string().max(255).describe("Farcaster avatar URL").optional(),
        isPrimary: z.boolean().optional(),
      }),
    )
    .nullable()
    .optional(),
  ethereum: z
    .array(
      z.object({
        address: z.string().describe("The Ethereum address of the user"),
        isPrimary: z.boolean().optional(),
        isDelegated: z.boolean().optional(),
      }),
    )
    .nullable()
    .optional(),
  profiles: z
    .array(
      z.object({
        referrerUserId: z
          .string()
          .describe("The ID of the user who referred this user")
          .optional(),
        isPrimary: z.boolean().optional(),
      }),
    )
    .nullable()
    .optional(),
  verifications: z
    .array(
      z.object({
        dateVerified: z.number().int().optional(),
        type: z.string().optional(),
      }),
    )
    .nullable()
    .optional(),
})
  .strict()
  .describe("A user profile in the system");

