/* Copyright (C) 2024 Manuel Bustillo*/

'use client';

import { createGuest, updateGuest } from '@/app/api/guests';
import { Group, Guest, GuestStatus, guestStatuses } from '@/app/lib/definitions';
import { capitalize } from '@/app/lib/utils';
import { classNames } from '@/app/ui/components/button';
import { Dialog } from 'primereact/dialog';
import { Dropdown } from 'primereact/dropdown';
import { FloatLabel } from 'primereact/floatlabel';
import { InputText } from 'primereact/inputtext';
import { useState } from 'react';

export default function GuestFormDialog({ groups, onCreate, onHide, guest, visible }: {
  groups: Group[],
  onCreate?: () => void,
  onHide: () => void,
  guest?: Guest,
  visible: boolean,
}) {

  const [name, setName] = useState(guest?.name || '');
  const [group, setGroup] = useState(guest?.groupId || null);
  const [status, setStatus] = useState<GuestStatus | null>(guest?.status || null);

  function resetForm() {
    setName('');
    setGroup(null);
    setStatus(null);
  }

  function submitGuest() {
    if (!(name && group && status)) {
      return
    }

    if (guest?.id !== undefined) {
      guest.name = name;
      guest.groupId = group;
      guest.status = status;
      updateGuest(guest).then(() => {
        resetForm();
        onCreate && onCreate();
      });
    } else {
      guest && createGuest({name: name, groupId: group, status: status}, () => {
        resetForm();
        onCreate && onCreate();
      });
    }
  }

  return (
    <>

      <Dialog header="Add guest" visible={visible} style={{ width: '60vw' }} onHide={onHide}>
        <div className="card flex justify-evenly py-5">
          <FloatLabel>
            <InputText id="username" className='rounded-sm' value={name} onChange={(e) => setName(e.target.value)} />
            <label htmlFor="username">Username</label>
          </FloatLabel>
          <FloatLabel>
            <Dropdown id="group" className='rounded-sm min-w-32' value={group} onChange={(e) => setGroup(e.target.value)} options={
              groups.map((group) => {
                return { label: group.name, value: group.id };
              })
            } />
            <label htmlFor="group">Group</label>
          </FloatLabel>
          <FloatLabel>
            <Dropdown id="status" className='rounded-sm min-w-32' value={status} onChange={(e) => setStatus(e.target.value)} options={
              guestStatuses.map((status) => {
                return { label: capitalize(status), value: status };
              })
            } />
            <label htmlFor="status">Status</label>
          </FloatLabel>
          <button className={classNames('primary')} onClick={submitGuest} disabled={!(name.length > 0 && group && status)}>
            {guest?.id !== undefined ? 'Update' : 'Create'}
          </button>
        </div>
      </Dialog>
    </>
  );
}