import fs from 'fs'
import path from 'path'
import crypto from 'crypto'
import { sql } from 'drizzle-orm'
import { getDb } from '../database/client'
import { workspaceMemberRepo } from '../database/repositories/workspace-member.repo'
import { getWorkspacesRoot } from '../forge-data'
import { initializeWorkspaceDir } from '../workspace-fs'

export interface ForgeAuthUser {
  id: string
  email: string
  name?: string | null
  image?: string | null
  role?: string | null
}

function safeSlug(input: string): string {
  const slug = input
    .toLowerCase()
    .replace(/@.*/, '')
    .replace(/[^a-z0-9._-]+/g, '-')
    .replace(/^-+|-+$/g, '')
    .slice(0, 40)
  return slug || 'user'
}

export function provisionDefaultWorkspace(user: ForgeAuthUser): void {
  const existing = workspaceMemberRepo.findFirstByOwner(user.id)
  if (existing) return

  const root = getWorkspacesRoot()
  const baseSlug = `${safeSlug(user.name || user.email)}-personal`
  let projectPath = path.join(root, baseSlug)
  let suffix = 2
  while (fs.existsSync(projectPath)) {
    projectPath = path.join(root, `${baseSlug}-${suffix}`)
    suffix++
  }

  fs.mkdirSync(projectPath, { recursive: true })
  initializeWorkspaceDir(projectPath, true)
  workspaceMemberRepo.create({
    id: crypto.randomUUID(),
    path: projectPath,
    ownerUserId: user.id,
  })
}

export function claimLegacyDataForUser(userId: string): void {
  const db = getDb()
  db.run(sql`UPDATE workspaces SET owner_user_id = ${userId} WHERE owner_user_id = ''`)
  db.run(sql`UPDATE sessions SET user_id = ${userId} WHERE user_id = ''`)
  db.run(sql`UPDATE api_providers SET user_id = ${userId} WHERE user_id = ''`)
  db.run(sql`UPDATE agents SET user_id = ${userId} WHERE user_id = ''`)
  db.run(sql`UPDATE skills SET user_id = ${userId} WHERE user_id = ''`)
  db.run(sql`UPDATE mcp_servers SET user_id = ${userId} WHERE user_id = ''`)
  db.run(sql`UPDATE im_channels SET owner_user_id = ${userId} WHERE owner_user_id = ''`)
  db.run(sql`UPDATE cron_tasks SET owner_user_id = ${userId} WHERE owner_user_id = ''`)
  db.run(sql`UPDATE webhook_tokens SET owner_user_id = ${userId} WHERE owner_user_id = ''`)
}
