import { sqliteTable, text, integer, uniqueIndex, index } from 'drizzle-orm/sqlite-core'
import { sql } from 'drizzle-orm'
import { InvitationStatus } from '../../shared/enums'

export const webhookTokens = sqliteTable('webhook_tokens', {
  id: text('id').primaryKey(),
  name: text('name').notNull().default(''),
  token: text('token').notNull(),
  enabled: integer('enabled').notNull().default(1),
  ownerUserId: text('owner_user_id').notNull().default(''),
  createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),
  updatedAt: text('updated_at').notNull().default(sql`(datetime('now'))`),
})

export type WebhookToken = typeof webhookTokens.$inferSelect
export type NewWebhookToken = typeof webhookTokens.$inferInsert

export const invitations = sqliteTable(
  'invitations',
  {
    id: text('id').primaryKey(),
    inviteToken: text('invite_token').notNull().unique(),
    inviterUserId: text('inviter_user_id').notNull(),
    inviteePhone: text('invitee_phone').notNull().default(''),
    inviteeName: text('invitee_name').notNull().default(''),
    status: text('status', {
      enum: [
        'pending',
        'phone_verified',
        'qr_generated',
        'bot_scanned',
        'bot_connected',
        'completed',
        'expired',
        'cancelled',
      ],
    }).notNull().default(InvitationStatus.PENDING),
    qrcodeKey: text('qrcode_key').notNull().default(''),
    qrcodeUrl: text('qrcode_url').notNull().default(''),
    botToken: text('bot_token').notNull().default(''),
    ilinkBotId: text('ilink_bot_id').notNull().default(''),
    baseurl: text('baseurl').notNull().default(''),
    cdnBaseurl: text('cdn_baseurl').notNull().default(''),
    createdUserId: text('created_user_id').notNull().default(''),
    createdUserDir: text('created_user_dir').notNull().default(''),
    createdChannelId: text('created_channel_id').notNull().default(''),
    projectRoot: text('project_root').notNull().default(''),
    expiresAt: integer('expires_at').notNull(),
    createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),
    updatedAt: text('updated_at').notNull().default(sql`(datetime('now'))`),
  },
  (t) => ({
    tokenUnique: uniqueIndex('idx_invitations_token').on(t.inviteToken),
    inviterIdx: index('idx_invitations_inviter').on(t.inviterUserId),
    statusIdx: index('idx_invitations_status').on(t.status),
    phoneIdx: index('idx_invitations_phone').on(t.inviteePhone),
  }),
)

export type Invitation = typeof invitations.$inferSelect
export type NewInvitation = typeof invitations.$inferInsert
