// Ours
const Now = require('../lib');

module.exports = class Secrets extends Now {
  ls() {
    return this.listSecrets();
  }

  rm(nameOrId) {
    return this.retry(async (bail, attempt) => {
      if (this._debug) {
        console.time(`> [debug] #${attempt} DELETE /secrets/${nameOrId}`);
      }

      const res = await this._fetch(`/now/secrets/${nameOrId}`, {
        method: 'DELETE'
      });

      if (this._debug) {
        console.timeEnd(`> [debug] #${attempt} DELETE /secrets/${nameOrId}`);
      }

      if (res.status === 403) {
        return bail(new Error('Unauthorized'));
      }

      const body = await res.json();

      if (res.status !== 200) {
        if (res.status === 404 || res.status === 400) {
          const err = new Error(body.error.message);
          err.userError = true;
          return bail(err);
        }

        throw new Error(body.error.message);
      }

      return body;
    });
  }

  add(name, value) {
    return this.retry(async (bail, attempt) => {
      if (this._debug) {
        console.time(`> [debug] #${attempt} POST /secrets`);
      }

      const res = await this._fetch('/now/secrets', {
        method: 'POST',
        body: {
          name,
          value: value.toString()
        }
      });

      if (this._debug) {
        console.timeEnd(`> [debug] #${attempt} POST /secrets`);
      }

      if (res.status === 403) {
        return bail(new Error('Unauthorized'));
      }

      const body = await res.json();

      if (res.status !== 200) {
        if (res.status === 404 || res.status === 400) {
          const err = new Error(body.error.message);
          err.userError = true;
          return bail(err);
        }

        throw new Error(body.error.message);
      }

      return body;
    });
  }

  rename(nameOrId, newName) {
    return this.retry(async (bail, attempt) => {
      if (this._debug) {
        console.time(`> [debug] #${attempt} PATCH /secrets/${nameOrId}`);
      }

      const res = await this._fetch(`/now/secrets/${nameOrId}`, {
        method: 'PATCH',
        body: {
          name: newName
        }
      });

      if (this._debug) {
        console.timeEnd(`> [debug] #${attempt} PATCH /secrets/${nameOrId}`);
      }

      if (res.status === 403) {
        return bail(new Error('Unauthorized'));
      }

      const body = await res.json();

      if (res.status !== 200) {
        if (res.status === 404 || res.status === 400) {
          const err = new Error(body.error.message);
          err.userError = true;
          return bail(err);
        }

        throw new Error(body.error.message);
      }

      return body;
    });
  }
};