const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const User = require("./User");

const Error_HaveSameThemeTitle = new Error("已經存在相同的主題名稱。");
const Error_ExistSameSponser = new Error("使用者已經在先前發起過一次主題了。");

let NewTheme = Schema({
    title: String,
    narrative: String,
    image: String,          // Image URL
    sponsor: String,
    votes: [String],
    createdTime: { type: Date, default: Date.now }
});

/**
 * 外部傳進來的新主題的必要資料項。
 * @typedef NewThemeDatas
 * @prop {string} title 新主題的主題名稱。
 * @prop {string} narrative 新主題的主題敘述。
 * @prop {string} image 新主題的圖示的連結位置。
 * @prop {string} sponsor 此新主題的發起人之使用者名稱。
 */
/**
 * 建立一個新的「新主題」資料。
 * @param {NewThemeDatas} datas 原初的資料集合。
 * @param {CallbackFunction} callback 回呼函式。成功時回呼_id。
 */
NewTheme.statics.createNew_NewTheme = function(datas, callback) {
    // 先檢查是否已有存在了相同的主題名稱 或 發起人在先前已經有發起過一次了
    this.findOne({title: datas.title}, (err, docs) => {
        if (err) return callback(err, null);
        if (docs) return callback(Error_HaveSameThemeTitle, null);  // 若使用者發起的主題名稱，別人已經發起過，則回呼錯誤

        // 建立新的主題名稱資料
        let new_NewTheme = this({
            title: datas.title,
            narrative: datas.narrative,
            image: datas.image,
            sponsor: datas.sponsor,
            votes: [],
            createdTime: new Date()
        });
        
        // 將其儲存後並回呼
        new_NewTheme.save((err) => {
            if (err) return callback(err, null);
            callback(null, new_NewTheme._id);
        }); 
    });
}

/**
 * 檢查是否為「已經存在相同的主題名稱」之錯誤。
 * @param {Error} error 欲進行檢查的錯誤。
 * @return {boolean} 檢查之結果。
 */
NewTheme.statics.IsError_HaveSameThemeTitle = function (error) {
    return error === Error_HaveSameThemeTitle;
}

/**
 * 檢查是否為「已經存在相同的主題名稱」之錯誤。
 * @param {Error} error 欲進行檢查的錯誤。
 * @return {boolean} 檢查之結果。
 */
NewTheme.statics.IsError_ExistSameSponser = function (error) {
    return error === Error_ExistSameSponser;
}

module.exports = mongoose.model("NewTheme", NewTheme);