/*
 * Copyright OpenSearch Contributors
 * SPDX-License-Identifier: Apache-2.0
 */

import { Dashboard, DashboardParams } from '../../dashboard';
import { SavedObjectDashboard } from '../../saved_dashboards';
import { convertToSerializedDashboard } from '../../saved_dashboards/_saved_dashboard';
import { DashboardServices } from '../../types';

export const getDashboardInstance = async (
  dashboardServices: DashboardServices,
  /**
   * opts can be either a saved dashboard id passed as string,
   * or an object of new dashboard params.
   * Both come from url search query
   */
  opts?: Record<string, unknown> | string
): Promise<{
  savedDashboard: SavedObjectDashboard;
  dashboard: Dashboard<DashboardParams>;
}> => {
  const { savedDashboards } = dashboardServices;

  // Get the existing dashboard/default new dashboard from saved object loader
  const savedDashboard: SavedObjectDashboard = await savedDashboards.get(opts);

  // Serialized the saved object dashboard
  const serializedDashboard = convertToSerializedDashboard(savedDashboard);

  // Create a Dashboard class using the serialized dashboard
  const dashboard = new Dashboard(serializedDashboard);
  dashboard.setState(serializedDashboard);

  return {
    savedDashboard,
    dashboard,
  };
};