import { InsurancePolicy } from '@rentaldrivego/database'
import { prisma } from '../lib/prisma'
import { resolveSettingsEntitlements } from '../modules/companies/settingsEntitlements'

export function calculateInsuranceCharge(
  policy: InsurancePolicy,
  totalDays: number,
  baseRentalAmount: number
): number {
  switch (policy.chargeType) {
    case 'PER_DAY':               return policy.chargeValue * totalDays
    case 'PER_RENTAL':            return policy.chargeValue
    case 'PERCENTAGE_OF_RENTAL':  return Math.round(baseRentalAmount * policy.chargeValue / 100)
    default:                      return 0
  }
}

export async function applyInsurancesToReservation(
  reservationId: string,
  companyId: string,
  selectedPolicyIds: string[],
  totalDays: number,
  baseRentalAmount: number
) {
  const entitlements = await resolveSettingsEntitlements(companyId)
  if (!entitlements.features['settings.insurance_policies']?.available) {
    return { records: [], insuranceTotal: 0 }
  }

  const allPolicies = await prisma.insurancePolicy.findMany({ where: { companyId, isActive: true } })
  const required = allPolicies.filter((p: InsurancePolicy) => p.isRequired)
  const selected = allPolicies.filter((p: InsurancePolicy) => selectedPolicyIds.includes(p.id) && !p.isRequired)
  const toApply = [...required, ...selected]

  const records = toApply.map((policy) => ({
    reservationId,
    insurancePolicyId: policy.id,
    policyName: policy.name,
    policyType: policy.type,
    chargeType: policy.chargeType,
    chargeValue: policy.chargeValue,
    totalCharge: calculateInsuranceCharge(policy, totalDays, baseRentalAmount),
  }))

  const insuranceTotal = records.reduce((s, r) => s + r.totalCharge, 0)

  await prisma.$transaction([
    prisma.reservationInsurance.createMany({ data: records }),
    prisma.reservation.update({
      where: { id: reservationId },
      data: {
        insuranceTotal,
        totalAmount: { increment: insuranceTotal },
      },
    }),
  ])

  return { records, insuranceTotal }
}
