import { useRouter } from 'next/router'
import { Form, Select, DatePicker } from './form'
import { ITEM_SORTS, SUB_SORTS, USER_SORTS, WHENS } from '@/lib/constants'
import { whenToFrom } from '@/lib/time'

export default function TopHeader ({ sub, cat }) {
  const router = useRouter()

  const top = async values => {
    const { what, when, ...query } = values

    if (what === 'cowboys') {
      await router.push({
        pathname: `/top/${what}`
      })
      return
    }

    const prefix = sub ? `/~${sub}` : ''

    if (typeof query.by !== 'undefined') {
      if (query.by === '' ||
          (what === 'stackers' && (query.by === 'value' || !USER_SORTS.includes(query.by))) ||
          (what === 'territories' && (query.by === 'stacking' || !SUB_SORTS.includes(query.by))) ||
          (['posts', 'comments'].includes(what) && (query.by === 'zaprank' || !ITEM_SORTS.includes(query.by)))) {
        delete query.by
      }
    }
    if (when !== 'custom') { delete query.from; delete query.to }
    if (query.from && !query.to) return

    await router.push({
      pathname: `${prefix}/top/${what}/${when || 'day'}`,
      query
    })
  }

  const what = cat
  const by = router.query.by || (what === 'stackers' ? 'value' : what === 'territories' ? 'stacking' : 'zaprank')
  const when = router.query.when || ''

  return (
    <div className='d-flex'>
      <Form
        className='me-auto'
        initial={{ what, by, when, from: '', to: '' }}
        onSubmit={top}
      >
        <div className='text-muted fw-bold my-1 d-flex align-items-center flex-wrap'>
          <div className='text-muted fw-bold mb-2 d-flex align-items-center'>
            <Select
              groupClassName='me-2 mb-0'
              onChange={(formik, e) => top({ ...formik?.values, what: e.target.value })}
              name='what'
              size='sm'
              overrideValue={what}
              items={router?.query?.sub ? ['posts', 'comments'] : ['posts', 'comments', 'stackers', 'cowboys', 'territories']}
            />
            {cat !== 'cowboys' &&
              <>
                by
                <Select
                  groupClassName='mx-2 mb-0'
                  onChange={(formik, e) => top({ ...formik?.values, by: e.target.value })}
                  name='by'
                  size='sm'
                  overrideValue={by}
                  items={sortItemsForCategory(cat)}
                />
                for
                <Select
                  groupClassName='mb-0 mx-2'
                  onChange={(formik, e) => {
                    const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: Date.now() } : {}
                    top({ ...formik?.values, when: e.target.value, ...range })
                  }}
                  name='when'
                  size='sm'
                  overrideValue={when}
                  items={WHENS}
                />
              </>}

          </div>
          {when === 'custom' &&
            <DatePicker
              fromName='from'
              toName='to'
              className='p-0 px-2'
              onChange={(formik, [from, to], e) => {
                top({ ...formik?.values, from: from.getTime(), to: to.getTime() })
              }}
              from={router.query.from}
              to={router.query.to}
              when={when}
            />}
        </div>
      </Form>
    </div>
  )
}

function sortItemsForCategory (cat) {
  switch (cat) {
    case 'stackers':
      return USER_SORTS
    case 'territories':
      return SUB_SORTS
    default:
      return ITEM_SORTS
  }
}