import {
  EMPTY_JOB_REACTION_COUNTS,
  JobReactionSummary,
  JobReactionType,
  JobReactionUpdatePayload,
} from '@ehandyhire/shared';
import type { FeedJob } from '@/components/jobs/JobFeed';

export function defaultJobReactionSummary(): JobReactionSummary {
  return {
    counts: { ...EMPTY_JOB_REACTION_COUNTS },
    userReaction: null,
  };
}

export function applyOptimisticJobReaction(
  job: FeedJob,
  type: JobReactionType
): FeedJob {
  const prev = job.reactions ?? defaultJobReactionSummary();
  const counts = { ...prev.counts };
  let userReaction = prev.userReaction;

  if (userReaction === type) {
    counts[type] = Math.max(0, counts[type] - 1);
    userReaction = null;
  } else {
    if (userReaction) {
      counts[userReaction] = Math.max(0, counts[userReaction] - 1);
    }
    counts[type] += 1;
    userReaction = type;
  }

  return { ...job, reactions: { counts, userReaction } };
}

export function applyJobReactionUpdate(
  job: FeedJob,
  payload: JobReactionUpdatePayload,
  currentUserId?: string
): FeedJob {
  const prev = job.reactions ?? defaultJobReactionSummary();
  return {
    ...job,
    reactions: {
      counts: payload.counts,
      userReaction:
        payload.userId === currentUserId ? payload.userReaction : prev.userReaction,
    },
  };
}
