import { useEffect, useContext, createContext, useState, useCallback, useMemo } from 'react'
import Table from 'react-bootstrap/Table'
import ActionTooltip from './action-tooltip'
import Info from './info'
import styles from './fee-button.module.css'
import { gql, useQuery } from '@apollo/client'
import { FREEBIE_BASE_COST_THRESHOLD, SSR } from '../lib/constants'
import { numWithUnits } from '../lib/format'
import { useMe } from './me'
import AnonIcon from '../svgs/spy-fill.svg'
import { useShowModal } from './modal'
import Link from 'next/link'
import { SubmitButton } from './form'
const FeeButtonContext = createContext()
export function postCommentBaseLineItems ({ baseCost = 1, comment = false, me }) {
  // XXX this doesn't match the logic on the server but it has the same
  // result on fees ... will need to change the server logic to match
  const anonCharge = me
    ? {}
    : {
        anonCharge: {
          term: 'x 100',
          label: 'anon mult',
          modifier: (cost) => cost * 100
        }
      }
  return {
    baseCost: {
      term: baseCost,
      label: `${comment ? 'comment' : 'post'} cost`,
      modifier: (cost) => cost + baseCost
    },
    ...anonCharge
  }
}
export function postCommentUseRemoteLineItems ({ parentId, me } = {}) {
  if (!me) return () => {}
  const query = parentId
    ? gql`{ itemRepetition(parentId: "${parentId}") }`
    : gql`{ itemRepetition }`
  return function useRemoteLineItems () {
    const [line, setLine] = useState({})
    const { data } = useQuery(query, SSR ? {} : { pollInterval: 1000, nextFetchPolicy: 'cache-and-network' })
    useEffect(() => {
      const repetition = data?.itemRepetition || 0
      if (!repetition) return
      setLine({
        itemRepetition: {
          term: <>x 10{repetition}>,
          label: <>{repetition} {parentId ? 'repeat or self replies' : 'posts'} in 10m>,
          modifier: (cost) => cost * Math.pow(10, repetition)
        }
      })
    }, [data?.itemRepetition])
    return line
  }
}
export function FeeButtonProvider ({ baseLineItems = {}, useRemoteLineItems = () => null, children }) {
  const [lineItems, setLineItems] = useState({})
  const [disabled, setDisabled] = useState(false)
  const remoteLineItems = useRemoteLineItems()
  const mergeLineItems = useCallback((newLineItems) => {
    setLineItems(lineItems => ({
      ...lineItems,
      ...newLineItems
    }))
  }, [setLineItems])
  const value = useMemo(() => {
    const lines = { ...baseLineItems, ...lineItems, ...remoteLineItems }
    return {
      lines,
      merge: mergeLineItems,
      total: Object.values(lines).reduce((acc, { modifier }) => modifier(acc), 0),
      disabled,
      setDisabled
    }
  }, [baseLineItems, lineItems, remoteLineItems, mergeLineItems, disabled, setDisabled])
  return (
    
| {term} | {label} | 
| {numWithUnits(total, { abbreviate: false, format: true })} | total fee |