/** Platform-wide prior mean rating for Bayesian smoothing. */
export const WORKER_RANK_PRIOR_MEAN = 4.2;

/** Minimum review weight — dampens one-off 5-star scores. */
export const WORKER_RANK_PRIOR_WEIGHT = 5;

export type WorkerRankInput = {
  averageRating: number;
  totalReviews: number;
  isVerified: boolean;
  portfolioCount: number;
  experienceYears: number;
  isAvailable: boolean;
  createdAt?: Date;
};

/**
 * Composite discovery score for worker listings.
 * Higher is better; not shown to users directly.
 */
export function computeWorkerRankScore(input: WorkerRankInput): number {
  const { averageRating, totalReviews, isVerified, portfolioCount, experienceYears, isAvailable } =
    input;

  const bayesian =
    (totalReviews * averageRating + WORKER_RANK_PRIOR_WEIGHT * WORKER_RANK_PRIOR_MEAN) /
    (totalReviews + WORKER_RANK_PRIOR_WEIGHT);

  const reviewBoost = 1 + Math.log10(totalReviews + 1) * 0.15;
  let score = bayesian * reviewBoost;

  if (isVerified) score *= 1.08;
  if (portfolioCount > 0) score *= 1.04;
  if (experienceYears >= 5) score *= 1.02;
  if (!isAvailable) score *= 0.5;

  if (input.createdAt) {
    const daysSinceJoin = (Date.now() - input.createdAt.getTime()) / (1000 * 60 * 60 * 24);
    if (daysSinceJoin < 60) {
      score *= 1 + (60 - daysSinceJoin) / 600;
    }
  }

  return Math.round(score * 1000) / 1000;
}
