// src/server/features/reference_books/db/inventory.table.ts
// Inventory table schema for tracking material assets (unified storage for all inventory types)

import { mysqlTable, varchar, text, timestamp, decimal } from 'drizzle-orm/mysql-core';
import { randomUUID } from 'node:crypto';

/**
 * Категории инвентаря
 */
export const inventoryCategoryEnum = [
  'tools',        // Инструменты
  'consumables',  // Расходники
  'linen',        // Белье
  'tableware',    // Посуда
  'equipment',    // Оборудование
  'other',        // Прочее
] as const;

export type InventoryCategory = typeof inventoryCategoryEnum[number];

/**
 * Основная таблица инвентаря (единое хранилище для всех типов)
 */
export const inventoryTable = mysqlTable('inventory', {
  id: varchar('id', { length: 36 }).primaryKey().$defaultFn(() => randomUUID()),
  name: varchar('name', { length: 100 }).notNull(), // Название/Тип
  category: varchar('category', { length: 20 }).notNull(), // Категория: tools, consumables, linen, tableware, equipment, other
  quantity: decimal('quantity', { precision: 10, scale: 2 }).notNull(), // Количество
  unit: varchar('unit', { length: 20 }), // Ед. измерения: шт, кг, м, л
  location: varchar('location', { length: 100 }).notNull(), // Локация
  comment: text('comment'), // Комментарий
  
  // Дополнительные поля
  weightPerUnit: decimal('weight_per_unit', { precision: 10, scale: 3 }), // Вес за единицу (для linen)
  manufacturer: varchar('manufacturer', { length: 100 }), // Производитель/Бренд
  model: varchar('model', { length: 100 }), // Модель
  serialNumber: varchar('serial_number', { length: 100 }), // Инвентарный/серийный номер (для equipment)
  orderingLink: varchar('ordering_link', { length: 500 }), // Ссылка для заказа
  articleNumber: varchar('article_number', { length: 100 }), // Артикул
  
  createdAt: timestamp('created_at').notNull().defaultNow(),
  updatedAt: timestamp('updated_at').notNull().defaultNow().onUpdateNow(),
  archivedAt: timestamp('archived_at'), // Soft delete для архивации
});

// Типы для TypeScript
export type Inventory = typeof inventoryTable.$inferSelect;
export type InventoryInsert = typeof inventoryTable.$inferInsert;

/**
 * Статус черновика инвентаря
 */
export const inventoryPendingStatusEnum = [
  'pending',   // На согласовании
  'approved',  // Одобрено
  'rejected',  // Отклонено
  'to_delete', // На удаление
] as const;

export type InventoryPendingStatus = typeof inventoryPendingStatusEnum[number];

/**
 * Таблица черновиков инвентаря
 */
export const inventoryPendingTable = mysqlTable('inventory_pending', {
  id: varchar('id', { length: 36 }).primaryKey().$defaultFn(() => randomUUID()),
  // Клонируем все поля из inventory
  name: varchar('name', { length: 100 }).notNull(),
  category: varchar('category', { length: 20 }).notNull(),
  quantity: decimal('quantity', { precision: 10, scale: 2 }).notNull(),
  unit: varchar('unit', { length: 20 }),
  location: varchar('location', { length: 100 }).notNull(),
  comment: text('comment'),
  weightPerUnit: decimal('weight_per_unit', { precision: 10, scale: 3 }),
  manufacturer: varchar('manufacturer', { length: 100 }),
  model: varchar('model', { length: 100 }),
  serialNumber: varchar('serial_number', { length: 100 }),
  orderingLink: varchar('ordering_link', { length: 500 }),
  articleNumber: varchar('article_number', { length: 100 }),
  // Поля для workflow
  status: varchar('status', { length: 20 }).notNull().default('pending'),
  targetId: varchar('target_id', { length: 36 }), // Ссылка на оригинальный inventory.id
  createdBy: varchar('created_by', { length: 36 }).notNull(),
  reviewedBy: varchar('reviewed_by', { length: 36 }),
  reviewedAt: timestamp('reviewed_at'),
  rejectionReason: text('rejection_reason'),
  // Стандартные поля
  createdAt: timestamp('created_at').notNull().defaultNow(),
  updatedAt: timestamp('updated_at').notNull().defaultNow().onUpdateNow(),
});

export type InventoryPending = typeof inventoryPendingTable.$inferSelect;
export type InventoryPendingInsert = typeof inventoryPendingTable.$inferInsert;
