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

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

// 建立「主題」樣板
let ThemeSchema = Schema({
    order : Number,
    title : String,
    narrative : String,
    image : String,         // URL
    originator : String,
    participants : [{ type : Schema.Types.ObjectId, ref : "ParticipantInfo" }],
    views : Number,
    commentCount : Number
});

// 透過參數data來建立「主題」資料於表中。
ThemeSchema.statics.createNewTheme = function (data, callback) {
    let newTheme = this({
        order : data.order,
        title : data.title,
        narrative : data.narrative,
        image : data.image,         // URL
        originator : data.originator,
        participants : data.participants,
        views : data.views,
        commentCount : data.commentCount
    });
    newTheme.save((err, theme) => {
        if (err)
            callback(err, null);
        else
            callback(null, theme._id);
    });
}

/**
 * 轉移完成後回呼的函式定義。
 * @callback TransferCallback
 * @param {Error?} error 錯誤訊息物件。
 * @param {ObjectId[]?} docs_id 轉換後的所有主題對應的_id。
 */
/**
 * 自候選主題(NewTheme)轉移到主題(Theme)。當活動狀態要推向新的一季時所會用到的函式。
 * @param {NewTheme[]} newThemeDocs 要轉移的候選主題。
 * @param {TransferCallback} callback 回呼函式。
 */
ThemeSchema.statics.TransferFromNewTheme = function (newThemeDocs, callback) {
    let projectRoot = global.__dirname;                     // 此專案的根目錄
    let curNthSeason = ServerStatus.status.currentSeason;   // 取得目前最新一季的季數
    let newThemeDatas = [];                                 // 用來新增Theme資料的集合清單

    // 為每一個選中的候選主題建立Theme資料
    newThemeDatas.forEach((docs, index) => {
        let routePath = docs.image.split("/");                                  // 以字元"/"分解字串，取得路徑
        let fileName = routePath[routePath.length - 1];                         // 取得檔案名稱
        let URLFilePath = "/images/seasons/" + curNthSeason + "/" + fileName;   // 找資源用的URL檔案路徑
        let newFilePath = "/public" + URLFilePath;                              // 儲存用的相對檔案路徑

        // 將建立主題的基本資料加入至newThemeDatas中
        newThemeDatas.push({
            order: index,
            title: docs.title,
            narrative: docs.narrative,
            image: "/images/seasons/" + curNthSeason + "/" + fileName,
            originator: docs.sponsor,
            participants: [],
            views: 0,
            commentCount: 0
        });

        // 將檔案移動至新的資料夾中。
        // 從位置 "/public/images/newtheme" 轉移到 "/public/images/seasons/[currentNthSeason]" 之下
        // 其中檔案名稱不變。
        fileSystem.rename(projectRoot + "/public" + docs.image, projectRoot + newFilePath, (err) => {
            console.log("「轉移候選主題」: 在移動檔案\"%s\"至\"%s\"時發生了錯誤。", "/public" + docs.image, newFilePath);
        });
    });

    // 將所有選取的候選主題資料，插入、新增到Theme之中，並且回呼這些資料的_id，組成ObjectId清單。
    this.insertMany(newThemeDatas, (err, docsList) => {
        if (err) return callback(err, null);
        callback(null, docsList.map(docs => docs._id));
    });
}

module.exports = mongoose.model("Theme", ThemeSchema);