export interface PrivacyPolicyInput {
  siteName: string
  contactEmail: string
  jurisdiction?: string
  dataCollected: string[]
  thirdParties?: Array<{ name: string; purpose: string }>
  cookies?: Array<{ name: string; purpose: string; durationDays?: number }>
}

export type ConsentCategory = 'necessary' | 'analytics' | 'marketing' | 'preferences'

export interface ConsentState {
  categories: Record<ConsentCategory, boolean>
  recordedAt: string
  version: string
}

const CONSENT_CATEGORIES: ConsentCategory[] = ['necessary', 'analytics', 'marketing', 'preferences']

export function generatePrivacyPolicy(input: PrivacyPolicyInput): string {
  const lines: string[] = [
    `# Privacy Policy — ${input.siteName}`,
    '',
    `**Contact:** ${input.contactEmail}`,
  ]
  if (input.jurisdiction) {
    lines.push('', `**Jurisdiction:** ${input.jurisdiction}`)
  }
  lines.push('', '## Data We Collect', '')
  for (const item of input.dataCollected) {
    lines.push(`- ${item}`)
  }
  if (input.thirdParties?.length) {
    lines.push('', '## Third Parties', '')
    for (const tp of input.thirdParties) {
      lines.push(`- **${tp.name}** — ${tp.purpose}`)
    }
  }
  if (input.cookies?.length) {
    lines.push('', '## Cookies', '')
    for (const c of input.cookies) {
      const duration = c.durationDays !== undefined ? ` (${c.durationDays} days)` : ''
      lines.push(`- **${c.name}** — ${c.purpose}${duration}`)
    }
  }
  return lines.join('\n')
}

function coerceBool(raw: unknown): boolean {
  return raw === true
}

export function parseConsent(raw: unknown): ConsentState | null {
  if (typeof raw !== 'object' || raw === null) return null
  const obj = raw as Record<string, unknown>
  if (typeof obj.recordedAt !== 'string' || typeof obj.version !== 'string') return null
  if (typeof obj.categories !== 'object' || obj.categories === null) return null

  const cats = obj.categories as Record<string, unknown>
  const categories = {} as Record<ConsentCategory, boolean>
  for (const key of CONSENT_CATEGORIES) {
    categories[key] = key in cats ? coerceBool(cats[key]) : false
  }
  categories.necessary = true

  return {
    categories,
    recordedAt: obj.recordedAt,
    version: obj.version,
  }
}

export function defaultConsent(): ConsentState {
  return {
    categories: {
      necessary: true,
      analytics: false,
      marketing: false,
      preferences: false,
    },
    recordedAt: new Date().toISOString(),
    version: '1',
  }
}
