import { PAID_ACTION_PAYMENT_METHODS, TERRITORY_PERIOD_COST } from '@/lib/constants'
import { satsToMsats } from '@/lib/format'
import { nextBilling } from '@/lib/territory'
import { initialTrust } from './lib/territory'
import { throwOnExpiredUploads, uploadFees } from '@/api/resolvers/upload'

export const anonable = false

export const paymentMethods = [
  PAID_ACTION_PAYMENT_METHODS.FEE_CREDIT,
  PAID_ACTION_PAYMENT_METHODS.REWARD_SATS,
  PAID_ACTION_PAYMENT_METHODS.PESSIMISTIC
]

export async function getCost ({ billingType, uploadIds }, { models, me }) {
  const { totalFees } = await uploadFees(uploadIds, { models, me })
  return satsToMsats(BigInt(TERRITORY_PERIOD_COST(billingType)) + totalFees)
}

export async function perform ({ invoiceId, ...data }, { me, cost, tx }) {
  const { billingType } = data
  const billingCost = TERRITORY_PERIOD_COST(billingType)
  const billedLastAt = new Date()
  const billPaidUntil = nextBilling(billedLastAt, billingType)

  await throwOnExpiredUploads(data.uploadIds, { tx })
  if (data.uploadIds.length > 0) {
    await tx.upload.updateMany({
      where: {
        id: { in: data.uploadIds }
      },
      data: {
        paid: true
      }
    })
  }
  delete data.uploadIds

  const sub = await tx.sub.create({
    data: {
      ...data,
      billedLastAt,
      billPaidUntil,
      billingCost,
      rankingType: 'WOT',
      userId: me.id,
      SubAct: {
        create: {
          msats: cost,
          type: 'BILLING',
          userId: me.id
        }
      },
      SubSubscription: {
        create: {
          userId: me.id
        }
      }
    }
  })

  await tx.userSubTrust.createMany({
    data: initialTrust({ name: sub.name, userId: sub.userId })
  })

  return sub
}

export async function describe ({ name }) {
  return `SN: create territory ${name}`
}
