/** Project-level delivery / gate policy flags (defaults match README gates). */

export const DELIVERY_RULE_KEYS = [
  'requireAssigneeHours',
  'requireBaAnalysis',
  'requireDescriptionAc',
  'requireRequirementDoc',
  'requireReadyForDevelopment',
  'enforceRequiredSubtasks',
  'requireDevelopmentComplete',
  'requireUnitTestEvidence',
  'allowTypedEvidence',
  'enforceDependencies',
  'requireCodeReview',
  'requireQaPassed',
  'requireQaEvidence',
  'blockDoneOnBlockingBugs',
  'requireAcceptance',
  'requireTesterApproval',
  'requireBugRetestEvidence',
] as const;

export type DeliveryRuleKey = (typeof DELIVERY_RULE_KEYS)[number];

/** Defaults when creating a project or when a flag is missing on older data. */
export const DELIVERY_RULE_DEFAULTS: Record<DeliveryRuleKey, boolean> = {
  requireAssigneeHours: true,
  requireBaAnalysis: true,
  requireDescriptionAc: true,
  requireRequirementDoc: false,
  requireReadyForDevelopment: true,
  enforceRequiredSubtasks: true,
  requireDevelopmentComplete: true,
  requireUnitTestEvidence: true,
  allowTypedEvidence: false,
  enforceDependencies: true,
  requireCodeReview: true,
  requireQaPassed: true,
  requireQaEvidence: true,
  blockDoneOnBlockingBugs: true,
  requireAcceptance: true,
  requireTesterApproval: true,
  requireBugRetestEvidence: true,
};

export type DeliveryRules = Record<DeliveryRuleKey, boolean>;

export function pickDeliveryRules(
  source: Partial<Record<DeliveryRuleKey, boolean | null | undefined>> | null | undefined
): DeliveryRules {
  const out = { ...DELIVERY_RULE_DEFAULTS };
  for (const key of DELIVERY_RULE_KEYS) {
    if (typeof source?.[key] === 'boolean') out[key] = source[key] as boolean;
  }
  return out;
}

export function ruleEnabled(
  project: Partial<Record<DeliveryRuleKey, boolean | null | undefined>> | null | undefined,
  key: DeliveryRuleKey
): boolean {
  if (typeof project?.[key] === 'boolean') return project[key] as boolean;
  return DELIVERY_RULE_DEFAULTS[key];
}
