import { InputGroup } from 'react-bootstrap'
import { getGetServerSideProps } from '../../../api/ssrApollo'
import { Form, Input } from '../../../components/form'
import { CenterLayout } from '../../../components/layout'
import { useMe } from '../../../components/me'
import { WalletButtonBar, WalletCard } from '../../../components/wallet-card'
import { useMutation } from '@apollo/client'
import { REMOVE_AUTOWITHDRAW, SET_AUTOWITHDRAW } from '../../../fragments/users'
import { useToast } from '../../../components/toast'
import { lnAddrAutowithdrawSchema, isNumber } from '../../../lib/validate'
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'
import { numWithUnits } from '../../../lib/format'

export const getServerSideProps = getGetServerSideProps({ authRequired: true })

function useAutoWithdrawEnabled () {
  const me = useMe()
  return me?.privates?.lnAddr && isNumber(me?.privates?.autoWithdrawThreshold) && isNumber(me?.privates?.autoWithdrawMaxFeePercent)
}

export default function LightningAddress () {
  const me = useMe()
  const toaster = useToast()
  const router = useRouter()
  const [setAutoWithdraw] = useMutation(SET_AUTOWITHDRAW)
  const enabled = useAutoWithdrawEnabled()
  const [removeAutoWithdraw] = useMutation(REMOVE_AUTOWITHDRAW)
  const autoWithdrawThreshold = isNumber(me?.privates?.autoWithdrawThreshold) ? me?.privates?.autoWithdrawThreshold : 10000
  const [sendThreshold, setSendThreshold] = useState(Math.max(Math.floor(autoWithdrawThreshold / 10), 1))

  useEffect(() => {
    setSendThreshold(Math.max(Math.floor(me?.privates?.autoWithdrawThreshold / 10), 1))
  }, [autoWithdrawThreshold])

  return (
    <CenterLayout>
      <h2 className='pb-2'>lightning address</h2>
      <h6 className='text-muted text-center pb-3'>autowithdraw to a lightning address to maintain desired balance</h6>
      <Form
        initial={{
          lnAddr: me?.privates?.lnAddr || '',
          autoWithdrawThreshold,
          autoWithdrawMaxFeePercent: isNumber(me?.privates?.autoWithdrawMaxFeePercent) ? me?.privates?.autoWithdrawMaxFeePercent : 1
        }}
        schema={lnAddrAutowithdrawSchema({ me })}
        onSubmit={async ({ autoWithdrawThreshold, autoWithdrawMaxFeePercent, ...values }) => {
          try {
            await setAutoWithdraw({
              variables: {
                lnAddr: values.lnAddr,
                autoWithdrawThreshold: Number(autoWithdrawThreshold),
                autoWithdrawMaxFeePercent: Number(autoWithdrawMaxFeePercent)
              }
            })
            toaster.success('saved settings')
            router.push('/settings/wallets')
          } catch (err) {
            console.error(err)
            toaster.danger('failed to attach:' + err.message || err.toString?.())
          }
        }}
      >
        <Input
          label='lightning address'
          name='lnAddr'
          required
          autoFocus
        />
        <Input
          label='desired balance'
          name='autoWithdrawThreshold'
          onChange={(formik, e) => {
            const value = e.target.value
            setSendThreshold(Math.max(Math.floor(value / 10), 1))
          }}
          hint={isNumber(sendThreshold) ? `note: attempts to keep your balance within ${numWithUnits(sendThreshold)} of this amount` : undefined}
          append={<InputGroup.Text className='text-monospace'>sats</InputGroup.Text>}
        />
        <Input
          label='max fee'
          name='autoWithdrawMaxFeePercent'
          hint='max fee as percent of withdrawal amount'
          append={<InputGroup.Text>%</InputGroup.Text>}
        />
        <WalletButtonBar
          enabled={enabled} onDelete={async () => {
            try {
              await removeAutoWithdraw()
              toaster.success('saved settings')
              router.push('/settings/wallets')
            } catch (err) {
              console.error(err)
              toaster.danger('failed to unattach:' + err.message || err.toString?.())
            }
          }}
        />
      </Form>
    </CenterLayout>
  )
}

export function LightningAddressWalletCard () {
  const enabled = useAutoWithdrawEnabled()

  return (
    <WalletCard
      title='lightning address'
      badges={['receive only', 'non-custodialish']}
      provider='lightning-address'
      enabled={enabled}
    />
  )
}