import { z } from 'zod'
import type { InvoiceStatus } from './enums'

export type MilestoneId = string & { readonly __brand: 'MilestoneId' }
export type MilestoneStatus = 'pending' | 'complete'

export interface MilestoneObject {
  id: MilestoneId
  projectId: string
  name: string
  description: string | null
  amount: string
  dueDate: string | null
  completedAt: string | null
  status: MilestoneStatus
  invoiceId: string | null
  invoiceStatus: InvoiceStatus | null
  position: number
  createdAt: string
  createdBy: string
}

export interface MilestoneSummary {
  totalDefined: string
  invoiced: string
  remaining: string
  completeCount: number
  totalCount: number
  matchesBillingConfig: boolean
}

const dateRegex = /^\d{4}-\d{2}-\d{2}$/

export const createMilestoneSchema = z.object({
  name: z.string().trim().min(1).max(200),
  description: z.string().trim().max(2000).optional(),
  amount: z.coerce.number().positive().multipleOf(0.01),
  due_date: z.string().regex(dateRegex).optional(),
  position: z.number().int().min(0).optional(),
})

export const updateMilestoneSchema = createMilestoneSchema.partial().extend({
  invoice_id: z.string().optional(),
})

export type CreateMilestoneInput = z.infer<typeof createMilestoneSchema>
export type UpdateMilestoneInput = z.infer<typeof updateMilestoneSchema>
