const TestAgent = require('./test-agent');
const errors = require('@tryghost/errors');

/**
 * NOTE: this class is not doing much at the moment. It's rather a placeholder to put
 * any Members API specific functionality into. If there is none in the nearest
 * future, it would make sense to remove it alltogether.
 * @constructor
 * @param {Object} app  Ghost express app instance
 * @param {Object} options
 * @param {string} options.apiURL
 * @param {string} options.originURL
 */
class MembersAPITestAgent extends TestAgent {
    #bootOptions = null;

    constructor(app, options) {
        super(app, options);
        this.#bootOptions = options;
    }

    duplicate() {
        return new MembersAPITestAgent(this.app, this.#bootOptions);
    }

    async loginAs(email) {
        const membersService = require('../../../core/server/services/members');
        const memberRepository = membersService.api.members;

        const member = await memberRepository.get({email});

        if (!member) {
            // Create the member first with context internal if it doesn't exist to prevent sending a signup email
            await memberRepository.create({name: '', email}, {context: {internal: true}});
        }

        const magicLink = await membersService.api.getMagicLink(email, 'signin');
        const magicLinkUrl = new URL(magicLink);
        const token = magicLinkUrl.searchParams.get('token');

        const res = await this.get(`/?token=${token}`);

        if (res.statusCode !== 302) {
            throw new errors.IncorrectUsageError({
                message: res.body.errors[0].message
            });
        }

        return res.headers['set-cookie'];
    }
}

module.exports = MembersAPITestAgent;
