import { sql } from 'drizzle-orm';
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';

// Типы блоков контента (изображения, видео, аудио, таблицы и т.д.)
export type ContentBlock =
  | { type: 'text'; data: { html: string } }
  | { type: 'image'; data: { src: string; alt?: string; caption?: string } }
  | { type: 'video'; data: { src: string; poster?: string; caption?: string } }
  | { type: 'audio'; data: { src: string; caption?: string } }
  | { type: 'table'; data: { html: string; caption?: string } }
  | { type: 'embed'; data: { url: string; caption?: string } }
  | { type: 'divider' }
  | { type: 'heading'; data: { level: 1 | 2 | 3; text: string } };

export const publications = sqliteTable('publications', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  title: text('title').notNull(),
  slug: text('slug').notNull().unique(),
  // Простой текст для поиска; полный контент в contentBlocks
  excerpt: text('excerpt'),
  // JSON массив ContentBlock[]
  contentBlocks: text('contentBlocks', { mode: 'json' })
    .$type<ContentBlock[]>()
    .default(sql`'[]'`),
  // Превью изображение
  previewImage: text('previewImage'),
  url: text('url').notNull(),
  author: text('author'),
  status: text({ enum: ['draft', 'scheduled', 'published'] }).notNull().default('draft'),
  publishedAt: text('publishedAt'),
  scheduledAt: text('scheduledAt'),
  createdAt: text('createdAt')
    .notNull()
    .$defaultFn(() => new Date().toISOString()),
  updatedAt: text('updatedAt')
    .notNull()
    .$defaultFn(() => new Date().toISOString()),
});

export type Publication = typeof publications.$inferSelect;
export type NewPublication = typeof publications.$inferInsert;
