import { useState } from 'react' import { FileText, Plus, Pencil, Trash2, Printer, Copy, CheckCheck, ChevronDown, X as XIcon, Eye, } from 'lucide-react' import { cn } from '../lib/utils' import type { DocumentTemplate } from '../types' // ── Mock templates ───────────────────────────────────────────────────────────── const TEMPLATE_TYPES: { value: DocumentTemplate['type']; label: string; icon: string }[] = [ { value: 'registration', label: 'Регистрационная карта', icon: '📋' }, { value: 'invoice', label: 'Счёт / Квитанция', icon: '🧾' }, { value: 'contract', label: 'Договор', icon: '📄' }, { value: 'info', label: 'Информационный лист', icon: '📑' }, ] const VARIABLES = [ { var: '{hotel_name}', desc: 'Название отеля' }, { var: '{hotel_address}', desc: 'Адрес отеля' }, { var: '{guest_name}', desc: 'Имя гостя' }, { var: '{guest_email}', desc: 'Email гостя' }, { var: '{room_number}', desc: 'Номер комнаты' }, { var: '{room_type}', desc: 'Тип номера' }, { var: '{check_in}', desc: 'Дата заезда' }, { var: '{check_out}', desc: 'Дата выезда' }, { var: '{nights}', desc: 'Количество ночей' }, { var: '{adults}', desc: 'Кол-во взрослых' }, { var: '{children}', desc: 'Кол-во детей' }, { var: '{total_amount}', desc: 'Итоговая сумма' }, { var: '{paid_amount}', desc: 'Оплачено' }, { var: '{balance}', desc: 'Остаток к оплате' }, { var: '{today}', desc: 'Сегодняшняя дата' }, ] const MOCK_TEMPLATES: DocumentTemplate[] = [ { id: 'tpl1', hotelId: 'hotel-1', name: 'Регистрационная карта', type: 'registration', forCheckIn: true, printOrder: 1, content: `РЕГИСТРАЦИОННАЯ КАРТА ГОСТЯ {hotel_name} {hotel_address} Дата: {today} Гость: {guest_name} Email: {guest_email} Номер: {room_number} ({room_type}) Заезд: {check_in} Выезд: {check_out} Ночей: {nights} Гостей: {adults} взр. + {children} дет. Итого: {total_amount} ₽ Оплачено: {paid_amount} ₽ К доплате: {balance} ₽ Подпись гостя: _____________________ Дата: _______________________________`, }, { id: 'tpl2', hotelId: 'hotel-1', name: 'Счёт за проживание', type: 'invoice', forCheckIn: false, printOrder: 2, content: `СЧЁТ ЗА ПРОЖИВАНИЕ {hotel_name} Гость: {guest_name} Номер: {room_number} Период: {check_in} — {check_out} ({nights} ночей) ИТОГО К ОПЛАТЕ: {total_amount} ₽ Оплачено: {paid_amount} ₽ Остаток: {balance} ₽ Спасибо за выбор нашего отеля!`, }, { id: 'tpl3', hotelId: 'hotel-1', name: 'Правила проживания', type: 'info', forCheckIn: true, printOrder: 3, content: `ПРАВИЛА ПРОЖИВАНИЯ {hotel_name} Уважаемый гость, {guest_name}! Добро пожаловать в наш отель. Время заезда: 14:00 Время выезда: 12:00 Основные правила: • Тишина с 22:00 до 08:00 • Курение запрещено в номерах • Домашние животные по согласованию • Бассейн и спортзал — с 07:00 до 22:00 Ресепшн работает круглосуточно. Звоните: 0 (внутренний номер) Приятного отдыха!`, }, ] // ── Document preview with variable substitution ──────────────────────────────── function previewContent(content: string): string { return content .replace(/\{hotel_name\}/g, 'Grand Palace Hotel') .replace(/\{hotel_address\}/g, 'г. Москва, ул. Тверская, 1') .replace(/\{guest_name\}/g, 'Иванов Иван Иванович') .replace(/\{guest_email\}/g, 'ivanov@example.com') .replace(/\{room_number\}/g, '301') .replace(/\{room_type\}/g, 'Пентхаус') .replace(/\{check_in\}/g, '15.03.2026') .replace(/\{check_out\}/g, '18.03.2026') .replace(/\{nights\}/g, '3') .replace(/\{adults\}/g, '2') .replace(/\{children\}/g, '0') .replace(/\{total_amount\}/g, '45 000') .replace(/\{paid_amount\}/g, '22 500') .replace(/\{balance\}/g, '22 500') .replace(/\{today\}/g, '15.03.2026') } // ── Template editor ──────────────────────────────────────────────────────────── interface EditorProps { template?: DocumentTemplate onClose: () => void onSave: (tpl: DocumentTemplate) => void } function TemplateEditor({ template, onClose, onSave }: EditorProps) { const isEdit = !!template const [name, setName] = useState(template?.name ?? '') const [type, setType] = useState(template?.type ?? 'registration') const [content, setContent] = useState(template?.content ?? '') const [forCheckIn, setForCheckIn] = useState(template?.forCheckIn ?? false) const [preview, setPreview] = useState(false) const [copiedVar, setCopiedVar] = useState(null) const insertVar = (v: string) => { const el = document.getElementById('tpl-content') as HTMLTextAreaElement if (!el) { setContent(c => c + v); return } const start = el.selectionStart ?? content.length const end = el.selectionEnd ?? content.length const next = content.slice(0, start) + v + content.slice(end) setContent(next) setTimeout(() => { el.focus(); el.setSelectionRange(start + v.length, start + v.length) }, 10) } const handleSave = () => { if (!name.trim()) return onSave({ id: template?.id ?? `tpl-${Date.now()}`, hotelId: template?.hotelId ?? 'hotel-1', name: name.trim(), type, content, forCheckIn, printOrder: template?.printOrder ?? 99, }) } return (
{/* Header */}

{isEdit ? `Редактировать: ${template.name}` : 'Новый шаблон документа'}

{/* Left: editor */}
{/* Meta */}
setName(e.target.value)} />
{/* Content area */}
{preview ? (
{previewContent(content)}
) : (