// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import { createSelector } from 'reselect';
import type { CallHistoryState } from '../ducks/callHistory.preload.ts';
import type { StateType } from '../reducer.preload.ts';
import {
  AdhocCallStatus,
  CallType,
  type CallHistoryDetails,
} from '../../types/CallDisposition.std.ts';
import { getOwn } from '../../util/getOwn.std.ts';

const getCallHistory = (state: StateType): CallHistoryState =>
  state.callHistory;

export const getCallHistoryEdition = createSelector(
  getCallHistory,
  callHistory => {
    return callHistory.edition;
  }
);

export type CallHistorySelectorType = (
  callId: string
) => CallHistoryDetails | void;

export const getCallHistorySelector = createSelector(
  getCallHistory,
  (callHistory): CallHistorySelectorType => {
    return callId => {
      return getOwn(callHistory.callHistoryByCallId, callId);
    };
  }
);

export const getCallHistoryUnreadCount = createSelector(
  getCallHistory,
  callHistory => {
    return callHistory.unreadCount;
  }
);

export const getCallHistoryLatestCall = createSelector(
  getCallHistory,
  callHistory => {
    let latestCall = null;

    for (const call of Object.values(callHistory.callHistoryByCallId)) {
      // Skip unused call links
      if (
        call.type === CallType.Adhoc &&
        call.status === AdhocCallStatus.Pending
      ) {
        continue;
      }

      if (latestCall == null || call.timestamp > latestCall.timestamp) {
        latestCall = call;
      }
    }

    return latestCall;
  }
);
