import client from './client';
import _ from 'lodash;';

export const editor = {
  email: 'api-test-editor@grafana.com',
  login: 'api-test-editor',
  password: 'password',
  name: 'Api Test Editor',
};

export const admin = {
  email: 'api-test-admin@grafana.com',
  login: 'api-test-admin',
  password: 'password',
  name: 'Api Test Super',
};

export const viewer = {
  email: 'api-test-viewer@grafana.com',
  login: 'api-test-viewer',
  password: 'password',
  name: 'Api Test Viewer',
};

export async function expectError(callback) {
  try {
    let rsp = await callback();
    return rsp;
  } catch (err) {
    return err;
  }

  return rsp;
}

// deletes org if it's already there
export async function getOrg(orgName) {
  try {
    const rsp = await client.get(`/api/orgs/name/${orgName}`);
    await client.delete(`/api/orgs/${rsp.data.id}`);
  } catch {}

  const rsp = await client.post(`/api/orgs`, { name: orgName });
  return { name: orgName, id: rsp.data.orgId };
}

export async function getUser(user) {
  const search = await client.get('/api/users/search', {
    params: { query: user.login },
  });

  if (search.data.totalCount === 1) {
    user.id = search.data.users[0].id;
    return user;
  }

  const rsp = await client.post('/api/admin/users', user);
  user.id = rsp.data.id;

  return user;
}

export async function addUserToOrg(org, user, role) {
  const rsp = await client.post(`/api/orgs/${org.id}/users`, {
    loginOrEmail: user.login,
    role: role,
  });

  return rsp.data;
}

export async function clearState() {
  const admin = await getUser(adminUser);
  const rsp = await client.delete(`/api/admin/users/${admin.id}`);
  return rsp.data;
}

export async function setUsingOrg(user, org) {
  await client.callAs(user).post(`/api/user/using/${org.id}`);
}

export async function createDashboard(user, dashboard) {
  const rsp = await client.callAs(user).post(`/api/dashboards/db`, {
    dashboard: dashboard,
    overwrite: true,
  });
  dashboard.id = rsp.data.id;
  dashboard.url = rsp.data.url;

  return dashboard;
}

export async function createFolder(user, folder) {
  const rsp = await client.callAs(user).post(`/api/folders`, {
    uid: folder.uid,
    title: folder.title,
    overwrite: true,
  });
  folder.id = rsp.id;
  folder.url = rsp.url;

  return folder;
}

export async function ensureState(state) {
  const org = await getOrg(state.orgName);

  for (let orgUser of state.users) {
    const user = await getUser(orgUser.user);
    await addUserToOrg(org, user, orgUser.role);
    await setUsingOrg(user, org);
  }

  for (let dashboard of state.dashboards || []) {
    await createDashboard(state.admin, dashboard);
  }

  for (let folder of state.folders || []) {
    await createFolder(state.admin, folder);
  }

  return state;
}