/**
 * @license
 * Copyright 2022 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import {GerritView} from '../../services/router/router-model';
import {BranchName, RepoName} from '../../types/common';
import {encodeURL, getBaseUrl} from '../../utils/url-util';
import {define} from '../dependency';
import {Model} from '../model';
import {ViewState} from './base';

export enum RepoDetailView {
  GENERAL = 'general',
  ACCESS = 'access',
  BRANCHES = 'branches',
  COMMANDS = 'commands',
  DASHBOARDS = 'dashboards',
  TAGS = 'tags',
}

export interface RepoViewState extends ViewState {
  view: GerritView.REPO;
  detail?: RepoDetailView;
  repo?: RepoName;
  filter?: string | null;
  offset?: number | string;
  /**
   * This is for creating a change from the URL and then redirecting to a file
   * editing page.
   */
  createEdit?: {
    branch: BranchName;
    path: string;
  };
}

export function createRepoUrl(state: Omit<RepoViewState, 'view'>) {
  let url = `/admin/repos/${encodeURL(`${state.repo}`)}`;
  if (state.detail === RepoDetailView.GENERAL) {
    url += ',general';
  } else if (state.detail === RepoDetailView.ACCESS) {
    url += ',access';
  } else if (state.detail === RepoDetailView.BRANCHES) {
    url += ',branches';
  } else if (state.detail === RepoDetailView.TAGS) {
    url += ',tags';
  } else if (state.detail === RepoDetailView.COMMANDS) {
    url += ',commands';
  } else if (state.detail === RepoDetailView.DASHBOARDS) {
    url += ',dashboards';
  }
  return getBaseUrl() + url;
}

export const repoViewModelToken = define<RepoViewModel>('repo-view-model');

export class RepoViewModel extends Model<RepoViewState | undefined> {
  constructor() {
    super(undefined);
  }
}
