import { CreateRateCardSchema } from "@capakraken/shared";
import { createTRPCRouter, controllerProcedure, managerProcedure } from "../trpc.js";
import {
  addRateCardLine,
  createRateCard,
  deactivateRateCard,
  deleteRateCardLine,
  getRateCardById,
  listRateCards,
  lookupRateCardBestMatch,
  rateCardAddLineInputSchema,
  rateCardByIdInputSchema,
  rateCardDeleteLineInputSchema,
  rateCardListInputSchema,
  rateCardLookupBestMatchInputSchema,
  rateCardReplaceLinesInputSchema,
  rateCardResolveBestRateInputSchema,
  rateCardResolveLineInputSchema,
  rateCardUpdateInputSchema,
  rateCardUpdateLineInputSchema,
  replaceRateCardLines,
  resolveRateCard,
  resolveRateCardLine,
  updateRateCard,
  updateRateCardLine,
} from "./rate-card-procedure-support.js";

export const rateCardRouter = createTRPCRouter({
  list: controllerProcedure
    .input(rateCardListInputSchema)
    .query(({ ctx, input }) => listRateCards(ctx, input)),

  getById: controllerProcedure
    .input(rateCardByIdInputSchema)
    .query(({ ctx, input }) => getRateCardById(ctx, input)),

  lookupBestMatch: controllerProcedure
    .input(rateCardLookupBestMatchInputSchema)
    .query(({ ctx, input }) => lookupRateCardBestMatch(ctx, input)),

  resolveBestRate: controllerProcedure
    .input(rateCardResolveBestRateInputSchema)
    .query(({ ctx, input }) => resolveRateCard(ctx, input)),

  create: managerProcedure
    .input(CreateRateCardSchema)
    .mutation(({ ctx, input }) => createRateCard(ctx, input)),

  update: managerProcedure
    .input(rateCardUpdateInputSchema)
    .mutation(({ ctx, input }) => updateRateCard(ctx, input)),

  deactivate: managerProcedure
    .input(rateCardByIdInputSchema)
    .mutation(({ ctx, input }) => deactivateRateCard(ctx, input)),

  // ─── Line CRUD ─────────────────────────────────────────────────────────────

  addLine: managerProcedure
    .input(rateCardAddLineInputSchema)
    .mutation(({ ctx, input }) => addRateCardLine(ctx, input)),

  updateLine: managerProcedure
    .input(rateCardUpdateLineInputSchema)
    .mutation(({ ctx, input }) => updateRateCardLine(ctx, input)),

  deleteLine: managerProcedure
    .input(rateCardDeleteLineInputSchema)
    .mutation(({ ctx, input }) => deleteRateCardLine(ctx, input)),

  // ─── Batch operations ──────────────────────────────────────────────────────

  replaceLines: managerProcedure
    .input(rateCardReplaceLinesInputSchema)
    .mutation(({ ctx, input }) => replaceRateCardLines(ctx, input)),

  // ─── Rate resolution ───────────────────────────────────────────────────────

  resolveRateLine: controllerProcedure
    .input(rateCardResolveLineInputSchema)
    .query(({ ctx, input }) => resolveRateCardLine(ctx, input)),
});
