import React, { useEffect, useState } from 'react'
import { useRouter } from 'next/router'
import Link from 'next/link'
import Layout from '../../../../components/layout'
import Calendar from '../../../../components/calendar'
import { getServerSideBooking } from '../../../../lib/getServerSideProps'
import { Booking } from '../../../../db/booking'
import { getBookingStatus, patchBooking } from '../../../../helpers/booking'
import { daysFormatFrontend } from '../../../../helpers/date'
import { BOOKING_STATUS } from '../../../../db/enums'

export const getServerSideProps = getServerSideBooking;

export default function ShowBookingAdmin({
  booking: bookingProp,
}: {
  booking: Booking
}) {
  const router = useRouter()
  const [booking, setBooking] = useState(bookingProp)
  const [storingBooking, setStoringBooking] = useState(false)
  const [storingBookingError, setStoringBookingError] = useState(null)

  // in case the props change, update the internal state
  useEffect(() => setBooking(bookingProp), [bookingProp])

  const onStoreBooking = async (confirmed: boolean) => {
    try {
      setStoringBookingError(null)
      setStoringBooking(true)
      const updatedBooking = await patchBooking(booking.uuid, {
        status: confirmed ? BOOKING_STATUS.CONFIRMED : BOOKING_STATUS.REJECTED,
      })
      setBooking(updatedBooking)
    } catch (error) {
      setStoringBookingError('Buchung konnte nicht gespeichert werden.')
      console.error('Failed to store booking', error)
    }
    setStoringBooking(false)
  }

  return (
    <Layout>
        <h2 className="text-3xl">Buchung {booking.uuid}</h2>
        <Calendar start={booking.startDate} end={booking.endDate} />
        <div>
          <strong>Buchungszeitraum:</strong> {daysFormatFrontend(booking.days)}
        </div>
        <div>
          <strong>Bucher:</strong> {booking.name}
        </div>
        <div>
          <strong>Buchungsstatus:</strong> {getBookingStatus(booking.status)}
        </div>
        {storingBookingError && (
          <div className="error-message flex-grow">{storingBookingError}</div>
        )}
        <div className="my-6">
          <button
            onClick={() => onStoreBooking(true)}
            className="btn btn-blue"
            disabled={storingBooking}
          >
            Buchung Bestätigen
          </button>
          <button
            onClick={() => onStoreBooking(false)}
            className="btn btn-red"
            disabled={storingBooking}
          >
            Buchung Abweisen
          </button>
          <Link href={`${router.asPath}/bill`}>
            <a className="btn btn-gray">Rechnung</a>
          </Link>
        </div>
    </Layout>
  )
}
