import z from 'zod'
import {
  customFieldDefinitionCreateSchema,
  customFieldDefinitionUpdateSchema,
} from '@/lib/custom-fields'
import { billingFrequencyEnum } from '@/server/db/schema'

const clientInvolvementToggleSchema = z.enum(['on', 'off'])

const orgClientInvolvementValueSchema = z.object({
  proposals: clientInvolvementToggleSchema,
  requirements: clientInvolvementToggleSchema,
  milestones: clientInvolvementToggleSchema,
  timesheets: clientInvolvementToggleSchema,
  expenses: clientInvolvementToggleSchema,
  invoices: clientInvolvementToggleSchema,
})

export type ClientInvolvementValue = z.infer<
  typeof orgClientInvolvementValueSchema
>

export const updateOrgClientInvolvementSchema = z.object({
  organizationId: z.string().min(1),
  clientInvolvement: orgClientInvolvementValueSchema,
})

export const renameOrganizationSchema = z.object({
  organizationId: z.string().min(1),
  name: z.string().min(1, 'Name is required').max(100),
  slug: z
    .string()
    .min(1, 'Slug is required')
    .max(100)
    .regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens'),
})

export type BillingFrequency = (typeof billingFrequencyEnum.enumValues)[number]

export const timesheetDurationOptions = [
  'weekly',
  'biweekly',
  'monthly',
] as const
export type TimesheetDuration = (typeof timesheetDurationOptions)[number]

export const updateTimesheetDefaultsSchema = z.object({
  organizationId: z.string().min(1),
  defaultPayRate: z.number().int().min(0, 'Rate must be non-negative'),
  defaultPayCurrency: z.string().min(3).max(3),
  defaultPayFrequency: z.enum(billingFrequencyEnum.enumValues),
  // Billing defaults are optional and fall back to the pay values in the action.
  defaultBillingRate: z
    .number()
    .int()
    .min(0, 'Rate must be non-negative')
    .optional(),
  defaultBillingCurrency: z.string().min(3).max(3).optional(),
  defaultBillingFrequency: z.enum(billingFrequencyEnum.enumValues).optional(),
  defaultTimesheetDuration: z.enum(timesheetDurationOptions),
})

export const updateInvoiceNumberTemplateSchema = z.object({
  organizationId: z.string().min(1),
  projectId: z.string().min(1).optional(),
  invoiceNumberTemplate: z
    .string()
    .trim()
    .min(1, 'Template cannot be empty')
    .max(100, 'Template is too long'),
})

export const invoiceTimeUnitOptions = ['hours', 'minutes'] as const
export type InvoiceTimeUnit = (typeof invoiceTimeUnitOptions)[number]

export const updateInvoiceImportDefaultsSchema = z.object({
  organizationId: z.string().min(1),
  projectId: z.string().min(1).optional(),
  invoiceTimeUnit: z.enum(invoiceTimeUnitOptions),
})

export const updateInvoiceFromDetailsSchema = z.object({
  organizationId: z.string().min(1),
  invoiceFromName: z.string().max(200).optional(),
  invoiceFromAddress: z.string().max(1000).optional(),
})

export const deleteOrganizationSchema = z.object({
  organizationId: z.string().min(1),
  confirmName: z.string().min(1, 'Please type the workspace name to confirm'),
})

export const createOrgCustomFieldSchema = z.object({
  organizationId: z.string().min(1),
  definition: customFieldDefinitionCreateSchema,
})

export const updateOrgCustomFieldSchema = z.object({
  organizationId: z.string().min(1),
  fieldId: z.string().min(1),
  definition: customFieldDefinitionUpdateSchema,
})

export const deleteOrgCustomFieldSchema = z.object({
  organizationId: z.string().min(1),
  fieldId: z.string().min(1),
})
