import { useState } from 'react'
import { useAlert } from '../context/AlertContext'
import { useAuth } from '../context/AuthContext'
import { useParams, useNavigate, Link } from 'react-router-dom'
import { motion, AnimatePresence } from 'framer-motion'
import ConfirmModal from '../components/ConfirmModal'
import FormField from '../components/FormField'
import Forbidden from '../components/Forbidden'
import AdminDatePicker from '../components/AdminDatePicker'
import OfferItemsSection from '../components/OfferItemsSection'
import OfferScopeSection from '../components/OfferScopeSection'
import OfferCustomerPicker from '../components/OfferCustomerPicker'
import useModalLock from '../hooks/useModalLock'
import useOfferForm from '../hooks/useOfferForm'
import apiFetch from '../utils/api'
const API_BASE = '/api/admin'
export default function OfferDetail() {
const { id } = useParams()
const isEdit = Boolean(id)
const alert = useAlert()
const { hasPermission } = useAuth()
const navigate = useNavigate()
const {
loading, saving, errors, setErrors,
form, updateForm, items, setItems, sections,
customers, itemTemplates, scopeTemplates,
orderInfo, offerStatus, setOfferStatus,
totals, draftSavedAtLabel,
selectCustomer, clearCustomer,
updateItem, addItem, removeItem, addItemFromTemplate,
addSection, removeSection, updateSection, moveSection,
loadScopeTemplate, handleSave
} = useOfferForm({ id, isEdit, alert, navigate })
const [showItemTemplateMenu, setShowItemTemplateMenu] = useState(false)
const [showScopeTemplateMenu, setShowScopeTemplateMenu] = useState(false)
const [deleteConfirm, setDeleteConfirm] = useState(false)
const [deleting, setDeleting] = useState(false)
const [creatingOrder, setCreatingOrder] = useState(false)
const [showOrderModal, setShowOrderModal] = useState(false)
const [invalidateConfirm, setInvalidateConfirm] = useState(false)
const [invalidatingOffer, setInvalidatingOffer] = useState(false)
const [customerOrderNumber, setCustomerOrderNumber] = useState('')
const [orderAttachment, setOrderAttachment] = useState(null)
const [pdfLoading, setPdfLoading] = useState(false)
useModalLock(showOrderModal)
const isInvalidated = offerStatus === 'invalidated'
const isExpiredNotInvalidated = isEdit && !isInvalidated && !orderInfo && form.valid_until && new Date(form.valid_until) < new Date(new Date().toDateString())
const handleCreateOrder = async () => {
if (!customerOrderNumber.trim()) {
alert.error('Číslo objednávky zákazníka je povinné')
return
}
setCreatingOrder(true)
try {
const formData = new FormData()
formData.append('quotationId', id)
formData.append('customerOrderNumber', customerOrderNumber.trim())
if (orderAttachment) {
formData.append('attachment', orderAttachment)
}
const response = await apiFetch(`${API_BASE}/orders.php`, {
method: 'POST',
body: formData
})
const result = await response.json()
if (result.success) {
setShowOrderModal(false)
alert.success(result.message || 'Objednávka byla vytvořena')
navigate(`/orders/${result.data.order_id}`)
} else {
alert.error(result.error || 'Nepodařilo se vytvořit objednávku')
}
} catch {
alert.error('Chyba připojení')
} finally {
setCreatingOrder(false)
}
}
const handleInvalidateOffer = async () => {
setInvalidatingOffer(true)
try {
const response = await apiFetch(`${API_BASE}/offers.php?action=invalidate&id=${id}`, {
method: 'POST'
})
const result = await response.json()
if (result.success) {
setInvalidateConfirm(false)
setOfferStatus('invalidated')
alert.success(result.message || 'Nabídka byla zneplatněna')
} else {
alert.error(result.error || 'Nepodařilo se zneplatnit nabídku')
}
} catch {
alert.error('Chyba připojení')
} finally {
setInvalidatingOffer(false)
}
}
const handleDelete = async () => {
setDeleting(true)
try {
const response = await apiFetch(`${API_BASE}/offers.php?id=${id}`, { method: 'DELETE' })
const result = await response.json()
if (result.success) {
alert.success(result.message || 'Nabídka byla smazána')
navigate('/offers')
} else {
alert.error(result.error || 'Nepodařilo se smazat nabídku')
}
} catch {
alert.error('Chyba připojení')
} finally {
setDeleting(false)
setDeleteConfirm(false)
}
}
const handlePdf = async () => {
if (!isEdit || pdfLoading) return
setPdfLoading(true)
try {
const response = await apiFetch(`${API_BASE}/offers-pdf.php?id=${id}`)
if (response.status === 401) return
if (!response.ok) {
alert.error('Nepodařilo se vygenerovat PDF')
return
}
const html = await response.text()
const w = window.open('', '_blank')
if (w) {
w.document.open()
w.document.write(html)
w.document.close()
w.onload = () => w.print()
} else {
alert.error('Prohlížeč zablokoval vyskakovací okno')
}
} catch {
alert.error('Chyba při generování PDF')
} finally {
setPdfLoading(false)
}
}
const getRequiredPerm = () => {
if (!isEdit) return 'offers.create'
return isInvalidated ? 'offers.view' : 'offers.edit'
}
const requiredPerm = getRequiredPerm()
if (!hasPermission(requiredPerm)) return