import { z } from 'zod';

const hexColor = z.string().regex(/^#[0-9a-fA-F]{6}$/, 'Must be a hex color (e.g. #ff00ff)');

export const updateSiteSettingsSchema = z.object({
  // Organization
  organizationName: z.string().min(1).max(100).optional(),
  organizationShortName: z.string().min(1).max(10).optional(),
  organizationLogoUrl: z.string().url().nullable().optional().or(z.literal('')),
  organizationFaviconUrl: z.string().url().nullable().optional().or(z.literal('')),

  // Admin theme
  adminColorPrimary: hexColor.optional(),
  adminColorBgBase: hexColor.optional(),

  // Public theme
  publicColorPrimary: hexColor.optional(),
  publicColorBgBase: hexColor.optional(),
  publicColorBgContainer: hexColor.optional(),
  publicHeaderGradient: z.string().max(500).optional(),

  // Text
  footerText: z.string().max(200).optional(),
  loginSubtitle: z.string().max(50).optional(),

  // Email branding
  emailFromName: z.string().min(1).max(100).optional(),

  // SMTP configuration
  smtpHost: z.string().max(255).optional(),
  smtpPort: z.number().int().min(0).max(65535).optional(),
  smtpUser: z.string().max(255).optional(),
  smtpPass: z.string().max(500).optional(),
  smtpFromAddress: z.string().max(255).optional(),
  smtpActiveProvider: z.enum(['mailhog', 'production']).optional(),
  emailTestMode: z.boolean().optional(),
  testEmailRecipient: z.string().max(255).optional(),

  // Registration settings
  enablePublicRegistration: z.boolean().optional(),
  enableEmailVerification: z.boolean().optional(),
  autoApproveVerifiedUsers: z.boolean().optional(),

  // Feature toggles
  enableInfluence: z.boolean().optional(),
  enableMap: z.boolean().optional(),
  enableNewsletter: z.boolean().optional(),
  enableLandingPages: z.boolean().optional(),
  enableMediaFeatures: z.boolean().optional(),
  enablePayments: z.boolean().optional(),
  enableGalleryAds: z.boolean().optional(),
  enableChat: z.boolean().optional(),
  enableEvents: z.boolean().optional(),
  enableDocsComments: z.boolean().optional(),
  enableSms: z.boolean().optional(),
  enablePeople: z.boolean().optional(),
  enableSocial: z.boolean().optional(),
  enableMeet: z.boolean().optional(),
  enableMeetingPlanner: z.boolean().optional(),
  enableTicketedEvents: z.boolean().optional(),
  enablePolls: z.boolean().optional(),
  enableAnalytics: z.boolean().optional(),
  analyticsRetentionDays: z.number().int().min(7).max(365).optional(),
  analyticsGeoEnabled: z.boolean().optional(),
  trackAuthenticatedUsers: z.boolean().optional(),
  enableSocialCalendar: z.boolean().optional(),
  enablePetitions: z.boolean().optional(),
  enableDocsCollaboration: z.boolean().optional(),
  requireEventApproval: z.boolean().optional(),
  autoSyncPeopleToMap: z.boolean().optional(),

  // SMS connection config
  smsTermuxApiUrl: z.string().max(500).optional(),
  smsTermuxApiKey: z.string().max(500).optional(),
  smsTailscaleApiKey: z.string().max(500).optional(),
  smsTailscaleTailnet: z.string().max(200).optional(),
  smsTailscaleDeviceId: z.string().max(200).optional(),
  smsTailscaleDeviceName: z.string().max(200).optional(),

  // Gitea Docs Comments
  giteaApiToken: z.string().max(500).optional(),
  giteaCommentsRepoOwner: z.string().max(100).optional(),
  giteaCommentsRepoName: z.string().max(100).optional(),
  giteaOauthClientId: z.string().max(500).optional(),
  giteaOauthClientSecret: z.string().max(500).optional(),
  giteaSetupComplete: z.boolean().optional(),

  // User Provisioning
  enableUserProvisioning: z.boolean().optional(),
  provisionGitea: z.boolean().optional(),
  provisionGiteaTiming: z.enum(['lazy', 'eager']).optional(),
  provisionVaultwarden: z.boolean().optional(),
  provisionVaultwardenTiming: z.enum(['lazy', 'eager']).optional(),
  provisionListmonk: z.boolean().optional(),
  provisionListmonkTiming: z.enum(['lazy', 'eager']).optional(),

  // Auto-upgrade settings
  enableAutoUpgrade: z.boolean().optional(),
  autoUpgradeSchedule: z.enum([
    'daily-3am', 'daily-4am', 'daily-5am',
    'weekly-sun-3am', 'weekly-mon-3am', '12h', '24h',
  ]).optional(),
  autoUpgradePullServices: z.boolean().optional(),
  notifyAdminAutoUpgrade: z.boolean().optional(),

  // Navigation configuration (supports one level of nesting via groups)
  navConfig: z.object({
    items: z.array(z.object({
      id: z.string(),
      label: z.string(),
      path: z.string(),
      icon: z.string(),
      enabled: z.boolean(),
      order: z.number(),
      type: z.enum(['builtin', 'custom', 'group']),
      featureFlag: z.string().optional(),
      external: z.boolean().optional(),
      children: z.array(z.object({
        id: z.string(),
        label: z.string(),
        path: z.string(),
        icon: z.string(),
        enabled: z.boolean(),
        order: z.number(),
        type: z.enum(['builtin', 'custom']),
        featureFlag: z.string().optional(),
        external: z.boolean().optional(),
      })).optional(),
    })),
  }).optional(),

  // Notification settings
  notifyAdminPetitionMilestone: z.boolean().optional(),
  notifyAdminShiftSignup: z.boolean().optional(),
  notifyAdminResponseSubmitted: z.boolean().optional(),
  notifyAdminSignRequested: z.boolean().optional(),
  notifyAdminShiftCancellation: z.boolean().optional(),
  notifyVolunteerSessionSummary: z.boolean().optional(),
  notifyVolunteerCancellation: z.boolean().optional(),
  notifyVolunteerShiftReminder: z.boolean().optional(),
  notifyVolunteerShiftThankYou: z.boolean().optional(),
  notifyVolunteerReengagement: z.boolean().optional(),
  reengagementInactiveDays: z.number().int().min(1).max(365).optional(),
  reengagementCooldownDays: z.number().int().min(1).max(365).optional(),
});

export type UpdateSiteSettingsInput = z.infer<typeof updateSiteSettingsSchema>;
