/**
 * Club decider — pure state machine (FDS §6.7).
 *
 *   ensure_membership_requested:
 *     - NEW      → create-membership
 *     - INACTIVE → reactivate-membership
 *     - ACTIVE   → noop-membership
 *
 * Pure module: no imports from @/server/db, do-client, outbox-producer, payments, fetch.
 */

import type { ClubEvent, EnsureMembershipRequestedEvent, ClubMembershipState } from './events.js';
import type { ClubEffect } from './effects.js';

export type ClubErrorCode = 'MEMBERSHIP_REQUIRED' | 'VENDOR_NOT_FOUND';

export interface MembershipContext {
  state: ClubMembershipState;
  membershipId?: string;
}

export type ClubDecisionContext = { kind: 'membership'; context: MembershipContext };

export type ClubDecision =
  | { ok: true; effects: ClubEffect[] }
  | { ok: false; error: ClubErrorCode; message: string };

export function decide(ctx: ClubDecisionContext, event: ClubEvent): ClubDecision {
  switch (event.kind) {
    case 'ensure_membership_requested':
      if (ctx.kind !== 'membership') {
        return { ok: false, error: 'VENDOR_NOT_FOUND', message: 'Context kind mismatch' };
      }
      return decideMembership(ctx.context, event);
  }
}

function decideMembership(
  ctx: MembershipContext,
  event: EnsureMembershipRequestedEvent,
): ClubDecision {
  if (ctx.state === 'NEW') {
    return {
      ok: true,
      effects: [
        {
          kind: 'create-membership',
          userId: event.userId,
          vendorId: event.vendorId,
          joinedViaOrderLineId: event.joinedViaOrderLineId,
        },
      ],
    };
  }
  if (ctx.state === 'INACTIVE') {
    if (!ctx.membershipId) {
      return { ok: false, error: 'VENDOR_NOT_FOUND', message: 'INACTIVE membership missing id' };
    }
    return {
      ok: true,
      effects: [{ kind: 'reactivate-membership', membershipId: ctx.membershipId }],
    };
  }
  // ACTIVE
  if (!ctx.membershipId) {
    return { ok: false, error: 'VENDOR_NOT_FOUND', message: 'ACTIVE membership missing id' };
  }
  return { ok: true, effects: [{ kind: 'noop-membership', membershipId: ctx.membershipId }] };
}
