const path = require('path')
const fs = require('fs')
const os = require('os')

const { httpDownload } = require('../../utils/download')
const { unzip } = require('../../utils/unzip')
const { rm, cp } = require('../../utils/shell')
const project = require('../../project')

const updatefile = require('./updatefile')

const { PAGES_PATH, ROUTER_CONFIG_FILE, ROUTER_FILE } = require('../../constants')

module.exports.updatefile = {updatefile}

module.exports.injection = (modules, options) => {
    // -r，这边就是设置宿主App的入口为
    console.log("modules " + modules + " type " + typeof modules)
    let moduleArr = modules.split(" ")
    if (options.root) {
        if (moduleArr.length > 1){
            console.fatal("你只能注入一个Module作为入口")
        }else {
            let entryModule = moduleArr[0]
            var moduleName = entryModule.trim()
            var moduleVersion = "0.0.1"
            if (moduleName.search("@") != -1) {
                let index = moduleName.indexOf("@")
                moduleName = moduleName.substring(0, index)
                moduleVersion = moduleName.substring(index + 1, value.length)
            }
            injectModule(moduleName, moduleVersion, true)
        }
    } else {
        moduleArr.forEach(((value, index) => {
            var moduleName = value.trim()
            var moduleVersion = "0.0.1"
            if (value.search("@") != -1) {
                let index = value.indexOf("@")
                moduleName = value.substring(0, index)
                moduleVersion = value.substring(index + 1, value.length)
            }
            injectModule(moduleName, moduleVersion, false)
        }))
    }
}

/**
 * 注入对应的模块
 * @param moduleName        模块名称
 * @param moduleVersion     模块版本、
 * @param isEntrance        是否设置为入口
 * @returns {Promise<void>}
 */
async function injectModule(moduleName, moduleVersion, isEntrance){
    let urlSrc = `http://172.16.55.5:3280/api/xupd/rn/download/${moduleName}/${moduleVersion}`
    console.step(`下载模块：${moduleName} 版本：${moduleVersion} URL：${urlSrc}`)
    // RN项目根目录
    const pagesPath = project.fs.resolve(PAGES_PATH)
    const routerConfigFile = project.fs.resolve(ROUTER_CONFIG_FILE)
    const routerPath = project.fs.resolve(ROUTER_FILE)
    const tempPath = fs.mkdtempSync(os.tmpdir() + path.sep)
    const fileName = moduleName
    const zipFile = path.resolve(tempPath, `${fileName}.zip`)
    const filePath = path.resolve(pagesPath, fileName)
    if (fs.existsSync(filePath)) {
        await rm('-rf', filePath)
    }

    try {
        await httpDownload(urlSrc, zipFile)
        await unzip(zipFile, pagesPath)
        await cp(zipFile, project.fs.rootDir())

        let osxFilePath = path.dirname(zipFile)
        await rm('-rf', tempPath, path.resolve(osxFilePath, '__MACOSX'), path.resolve(project.fs.rootDir(), `${fileName}.zip`))

        await setupRouter(filePath, routerPath, moduleName, isEntrance)
        console.step(`${moduleName} 添加成功`)
    } catch (e) {
        if (e.type !== 'shell') {
            console.error(`下载失败: ${e.message}`)
        }
    }
}


/**
 * 导入下载的页面到路由，并且有入口设置入口
 * @param filePath      module的路径
 * @param routerPath    module router/index.js 路径
 * @param moduleName    module 的名字，用来判定rootModule
 * @param isEntrance    是否设置为入口
 */
//TODO： 多module次注入会执行多次，后面优化
function setupRouter (filePath, routerPath, moduleName, isEntrance) {
    console.step(`设置模块路由`)
    let appJsonPath = path.resolve(filePath, "app.json")
    if (fs.existsSync(filePath) && fs.existsSync(appJsonPath)) {
        let data = fs.readFileSync(appJsonPath)
        let appJson = JSON.parse(data)
        // 获取所有页面路径
        // let pagesPath = appJson.pages
        // 这边是获取所有injection的页面路径
        let pagesPath = getAppJsonPages(project.fs.resolve(PAGES_PATH))
        // 获取根页面路径
        var entryPagePath = appJson.entryPagePath

        if (pagesPath != undefined) {
            // 注册页面路由
            updatefile.registerRouterConfig(filePath, pagesPath, routerPath)
            /**
             * 现在的逻辑注入启动入口要适配rootModule
             */
            if (isEntrance) {
                if (entryPagePath != undefined && entryPagePath.trim() != "") {
                    // 配置在configure.json的Router
                    let originalConfigureRouter = updatefile.getOriginalRouterName(entryPagePath)
                    // 如果是rootModules就修改
                    if (originalConfigureRouter != undefined) {
                        let routerName = entryPagePath.toString().replace(/\//g, "_").replace(/\./g, "_")
                        updatefile.changeXcodeAppDelegateLaunchRouterPage(routerName)
                        updatefile.changeAndroidActivityLaunchRouterPage(routerName)
                        updatefile.updateConfigure(routerName)
                    }
                }else {
                    console.fatal("入口设置失败，因为注入模块的app.json的entryPagePath未定义")
                }
            }
            /**
             * 这边是之前的逻辑，现在是要重新修改
             */
            // // 如果有配置根页面则使用根页面（entryPagePath），如果没有配置根页面则默认取（pages）第一个配置页面为根页面，如果都没配置则默认 加载xupd默认页
            // if (entryPagePath == undefined || entryPagePath.trim() == "") {
            //     if (pagesPath.length > 0) {
            //         entryPagePath = appJson.pages[0]
            //     } else {
            //         entryPagePath = "xupd"
            //     }
            // }
            // // 配置在configure.json的Router
            // let originalConfigureRouter = updatefile.getOriginalRouterName(entryPagePath)
            // // 如果是rootModules就修改
            // if (originalConfigureRouter != undefined) {
            //     let routerName = entryPagePath.toString().replace(/\//g, "_").replace(/\./g, "_")
            //     updatefile.changeXcodeAppDelegateLaunchRouterPage(routerName)
            //     updatefile.changeAndroidActivityLaunchRouterPage(routerName)
            //     updatefile.updateConfigure(routerName)
            // }
        } else {
            console.log(`请配置app.json pages 路由地址为空, 请参照如下配置 "pages": ["Pro/productList/pageA", "Pro/productList/pageB"]`)
        }
    }
}

/**
 * 获取filePath目录下面的app.json里面标记的所有页面
 * @param filePath
 */
function getAppJsonPages(filePath) {
    let pages = updatefile.getJsonFiles(filePath)
    let appJsonPages = []
    pages.forEach(function (name) {
        if (name.search("app.json") != -1) {
            let data = fs.readFileSync(name)
            let appJson = JSON.parse(data)
            appJsonPages.push(appJson.pages)
        }
    })
    return appJsonPages
}
