import { getGetServerSideProps } from '@/api/ssrApollo'
import { Form, ClientInput, ClientCheckbox, PasswordInput } from '@/components/form'
import { CenterLayout } from '@/components/layout'
import { WalletButtonBar, WalletCard, isConfigured } from '@/components/wallet-card'
import { lnbitsSchema } from '@/lib/validate'
import { useToast } from '@/components/toast'
import { useRouter } from 'next/router'
import { useLNbits } from '@/components/webln/lnbits'
import { WalletSecurityBanner } from '@/components/banners'
import { useWebLNConfigurator } from '@/components/webln'
import WalletLogs from '@/components/wallet-logs'
import { Wallet } from '@/lib/constants'

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

export default function LNbits () {
  const { provider, enabledProviders, setProvider } = useWebLNConfigurator()
  const lnbits = useLNbits()
  const { name, url, adminKey, saveConfig, clearConfig, status } = lnbits
  const isDefault = provider?.name === name
  const configured = isConfigured(status)
  const toaster = useToast()
  const router = useRouter()

  return (
    <CenterLayout>
      <h2 className='pb-2'>LNbits</h2>
      <h6 className='text-muted text-center pb-3'>use LNbits for payments</h6>
      <WalletSecurityBanner />
      <Form
        initial={{
          url: url || '',
          adminKey: adminKey || '',
          isDefault: isDefault || false
        }}
        schema={lnbitsSchema}
        onSubmit={async ({ isDefault, ...values }) => {
          try {
            await saveConfig(values)
            if (isDefault) setProvider(lnbits)
            toaster.success('saved settings')
            router.push('/settings/wallets')
          } catch (err) {
            console.error(err)
            toaster.danger('failed to attach: ' + err.message || err.toString?.())
          }
        }}
      >
        <ClientInput
          initialValue={url}
          label='lnbits url'
          name='url'
          required
          autoFocus
        />
        <PasswordInput
          initialValue={adminKey}
          label='admin key'
          name='adminKey'
          newPass
          required
        />
        <ClientCheckbox
          disabled={!configured || isDefault || enabledProviders.length === 1}
          initialValue={isDefault}
          label='default payment method'
          name='isDefault'
        />
        <WalletButtonBar
          status={status} onDelete={async () => {
            try {
              await clearConfig()
              toaster.success('saved settings')
              router.push('/settings/wallets')
            } catch (err) {
              console.error(err)
              toaster.danger('failed to detach: ' + err.message || err.toString?.())
            }
          }}
        />
      </Form>
      <div className='mt-3 w-100'>
        <WalletLogs wallet={Wallet.LNbits} embedded />
      </div>
    </CenterLayout>
  )
}

export function LNbitsCard () {
  const { status } = useLNbits()
  return (
    <WalletCard
      title='LNbits'
      badges={['send only', 'non-custodialish']}
      provider='lnbits'
      status={status}
    />
  )
}