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

/**
 * 回呼函式，表示是否成功，並回傳物件。
 * @callback CallbackFunction
 * @param {Object} err 表示是否失敗。
 * @param {Object} obj 表示回呼的物件。
 */

/**
 * 精選集的模板定義。
 * @property {String} relation 表示此精選集的所屬。如首頁的精選集、藝廊的精選輯。
 * @property {Schema.Types.ObjectId[]} paintings 表示此精選集所有連接的圖畫。
 */
let PaintingSpotlightSchema = Schema({
    relation : {type : String, required : true},
    paintings : [{type : Schema.Types.ObjectId, ref : "Painting"}]
});

/**
 * 建立一個新的精選集。
 * @param {Object} data 包含要設定精選輯的資料。
 * @param {function} callback 回呼函式。
 */
PaintingSpotlightSchema.statics.createNewPaintingSpotlight = function (data, callback) {
    let newPaintingSpotlight = { relation : data.relation, paintings : data.paintings };
    newPaintingSpotlight.save((err, paintingSpotlight) => {
        if (err)
            callback(err, null);
        else
            callback(null, paintingSpotlight._id);
    });
};

/**
 * 指定一個精選集，將新畫作加入進去。
 * @param {string} collName 要加入新畫作的精選集。
 * @param {objectId} painting 要加入的新畫作的Id。
 * @param {function} callback 回呼函式(Error, IsSuccess)。
 */
PaintingSpotlightSchema.statics.addNewPaintingToCollection = function (collName, painting, callback) {
    this.findOne({relation : collName}, (err, obj) => {
        if (err) {
            callback(err, null);
            return;
        }
        obj.paintings.push(painting);
        obj.save((err, RObj) => {
            callback(err, RObj != null && RObj != undefined);
        });
    });
};

/**
 * 取得畫作展示所要的資訊
 * @param {string} collName 精選集的名稱
 * @param {function} callback 回呼函式(Error, IsSuccess)。
 */
PaintingSpotlightSchema.statics.GetCarouselInfo = function (collName, callback) {
    let query = {path : "paintings", select : {links : 1, name : 1, description : 1, artist : 1}};
    this.findOne({"relation" : collName}).populate(query).exec(callback);
};

module.exports = mongoose.model("PaintingSpotlight", PaintingSpotlightSchema);