const label = require('./label');
const { isCommitter } = require('./coreCommitters');
const { translate } = require('./translator');
const { removeHTMLComment } = require('./util');

/**
 * @typedef {import('probot').Context<'issues.opened'>} Context
 */

class Issue {
    /**
     * @param {Context} context
     */
    constructor(context) {
        this.context = context;
        this.issue = context.payload.issue;
        this.title = this.issue.title;
        this.body = this.issue.body || '';
        // null -> failed to translate -> unknown language
        // false -> translated -> not in English
        this.translatedTitle = null;
        this.translatedBody = null;
        this.addLabels = [];
        this.removeLabels = [];
        this.response = null;
    }

    async init () {
        // if author is committer, do not check if using template
        const isCore = isCommitter(this.issue.author_association, this.issue.user.login);

        if (!isCore) {
            // TODO if neither [bug] nor [feature] in title?
            this.title = (this.title || '').replace(
                /(.*)(\[(?:bug|feature)\])(.*)/i,
                function (match, p1, p2, p3) {
                    return p2 + ' ' + p1.trim() + p3.trim()
                }
            );
            // check if the title is valid
            if (this.isMissingTitle()) {
                this.addLabels.push(label.MISSING_TITLE);
                return;
            }
            // prevent from opening an issue with no template via `Reference in new issue` button
            if (!this.isUsingTemplate()) {
                this.addLabels.push(label.INVALID);
                return;
            }
            this.addLabels.push(label.PENDING);
            // this.addLabels.push(label.WAITING_FOR_COMMUNITY);
        }

        // translate issue
        await this._translate();

        const isInEnglish = (!this.translatedTitle && !this.translatedBody)
            || (!this.title.trim() && !this.translatedBody)
            || (!this.body.trim() && !this.translatedTitle);
        if (isInEnglish) {
            this.addLabels.push(label.EN);
        }
    }

    async _translate () {
        let res = await translate(this.title);
        if (res) {
            this.translatedTitle = res.lang !== 'en' && [res.translated, res.lang];
        }
        res = await translate(removeHTMLComment(this.body));
        if (res) {
            this.translatedBody = res.lang !== 'en' && [res.translated, res.lang];
        }
    }

    isUsingTemplate() {
        return this.body.includes('Steps to Reproduce')
            || this.body.includes('What problem does this feature solve');
    }

    isMissingTitle() {
        const title = this.title.trim();
        return !title || !title.toLowerCase().replace('[bug]', '').replace('[feature]', '');
    }

    isTitleChanged() {
        return this.title !== this.issue.title;
    }
}

module.exports = Issue;
