const passport = require('../../../passport');

const app = require('../../../../../app');
const mailer = require('../../../../../services/mailer');
const chai = require('chai');
const expect = chai.expect;

const SettingsService = require('../../../../../services/settings');
const settings = {id: '1', moderation: 'PRE', wordlist: {banned: ['bad words'], suspect: ['suspect words']}};

// Setup chai.
chai.should();
chai.use(require('chai-http'));

const UsersService = require('../../../../../services/users');

describe('/api/v1/users/:user_id/email/confirm', () => {

  let mockUser;

  beforeEach(() => SettingsService.init(settings).then(() => {
    return UsersService.createLocalUser('ana@gmail.com', '123321123', 'Ana');
  })
  .then((user) => {
    mockUser = user;
  }));

  describe('#post', () => {
    it('should send an email when we hit the endpoint', () => {
      expect(mailer.task.tasks).to.have.length(0);

      return chai.request(app)
        .post(`/api/v1/users/${mockUser.id}/email/confirm`)
        .set(passport.inject({roles: ['ADMIN']}))
        .then((res) => {
          expect(res).to.have.status(204);
          expect(mailer.task.tasks).to.have.length(1);
        });
    });

    it('should send a 404 on not matching a user', () => {
      return chai.request(app)
        .post(`/api/v1/users/${mockUser.id}/email/confirm`)
        .set(passport.inject({roles: ['ADMIN']}))
        .then((res) => {
          expect(res).to.have.status(204);
          expect(mailer.task.tasks).to.have.length(1);
        });
    });
  });
});

describe('/api/v1/users/:user_id/actions', () => {

  let mockUser;

  beforeEach(() => SettingsService.init(settings).then(() => {
    return UsersService.createLocalUser('ana@gmail.com', '123321123', 'Ana');
  })
  .then((user) => {
    mockUser = user;
  }));

  describe('#post', () => {
    it('it should update actions', () => {
      return chai.request(app)
        .post(`/api/v1/users/${mockUser.id}/actions`)
        .set(passport.inject({id: '456', roles: ['ADMIN']}))
        .send({'action_type': 'FLAG', metadata: {reason: 'Bio is too awesome.'}})
        .then((res) => {
          expect(res).to.have.status(201);
          expect(res).to.have.body;
          expect(res.body).to.have.property('action_type', 'FLAG');
          expect(res.body).to.have.property('item_id', mockUser.id);
        });
    });
  });
});

describe('/api/v1/users/:user_id/username-enable', () => {
  let mockUser;

  beforeEach(() => SettingsService.init(settings).then(() => {
    return UsersService.createLocalUser('ana@gmail.com', '123321123', 'Ana');
  })
  .then((user) => {
    mockUser = user;
  }));

  describe('#post', () => {
    it('it should enable a user to edit their username', () => {
      return chai.request(app)
        .post(`/api/v1/users/${mockUser.id}/username-enable`)
        .set(passport.inject({id: '456', roles: ['ADMIN']}))
        .then((res) => {
          expect(res).to.have.status(204);
        });
    });
  });
});
