--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Copyright (C) 2015-present, Xmake Open Source Community.
--
-- @author      ruki
-- @file        basic.lua
--

-- imports
import("core.base.option")
import("core.base.global")
import("core.base.json")
import("core.project.config")
import("core.project.project")
import("core.package.package")

function _show_xmake_info(opt, result)
    local json_enabled = opt and opt.json
    local info = {
        version = tostring(xmake.version()),
        host = {os = os.host(), arch = os.arch()},
        programdir = xmake.programdir(),
        programfile = xmake.programfile(),
        globaldir = global.directory(),
        tmpdir = os.tmpdir(),
        workingdir = os.workingdir(),
        packagedir = package.installdir(),
        packagedir_cache = package.cachedir()
    }
    if json_enabled then
        result = result or {}
        result.xmake = info
    else
        print("The information of xmake:")
        cprint("    ${color.dump.string}version${clear}: %s", info.version)
        cprint("    ${color.dump.string}host${clear}: %s/%s", info.host.os, info.host.arch)
        cprint("    ${color.dump.string}programdir${clear}: %s", info.programdir)
        cprint("    ${color.dump.string}programfile${clear}: %s", info.programfile)
        cprint("    ${color.dump.string}globaldir${clear}: %s", info.globaldir)
        cprint("    ${color.dump.string}tmpdir${clear}: %s", info.tmpdir)
        cprint("    ${color.dump.string}workingdir${clear}: %s", info.workingdir)
        cprint("    ${color.dump.string}packagedir${clear}: %s", info.packagedir)
        cprint("    ${color.dump.string}packagedir(cache)${clear}: %s", info.packagedir_cache)
        print("")
    end
    return result
end

function _show_project_info(opt, result)
    local json_enabled = opt and opt.json
    local projectfile = os.projectfile()
    if not os.isfile(projectfile) then
        return result
    end

    local info = {
        configdir = config.directory(),
        projectdir = os.projectdir(),
        projectfile = projectfile
    }
    local name = project.name()
    if name then
        info.name = name
    end
    local project_version = project.version()
    if project_version ~= nil then
        info.version = tostring(project_version)
    end
    local plat = config.plat()
    if plat then
        info.plat = plat
    end
    local arch = config.arch()
    if arch then
        info.arch = arch
    end
    local mode = config.mode()
    if mode then
        info.mode = mode
    end
    local builddir = config.builddir()
    if builddir then
        info.builddir = builddir
    end

    if json_enabled then
        result = result or {}
        result.project = info
    else
        print("The information of project: %s", info.name or "")
        if info.version then
            cprint("    ${color.dump.string}version${clear}: %s", info.version)
        end
        if info.plat then
            cprint("    ${color.dump.string}plat${clear}: %s", info.plat)
        end
        if info.arch then
            cprint("    ${color.dump.string}arch${clear}: %s", info.arch)
        end
        if info.mode then
            cprint("    ${color.dump.string}mode${clear}: %s", info.mode)
        end
        if info.builddir then
            cprint("    ${color.dump.string}builddir${clear}: %s", info.builddir)
        end
        cprint("    ${color.dump.string}configdir${clear}: %s", info.configdir)
        cprint("    ${color.dump.string}projectdir${clear}: %s", info.projectdir)
        cprint("    ${color.dump.string}projectfile${clear}: %s", info.projectfile)
        print("")
    end
    return result
end

-- show basic info
function main()

    config.load()

    -- support --format=json, with --json/--pretty backward compatibility
    local format = option.get("format") or "plain"
    if format == "plain" and option.get("json") then
        format = "json"
    end
    local opt = {
        json = format == "json",
        pretty = option.get("pretty")
    }
    local result = opt.json and {} or nil

    result = _show_xmake_info(opt, result)
    result = _show_project_info(opt, result)

    if opt.json then
        local json_opt = {pretty = true, orderkeys = true}
        if option.get("json") and not option.get("pretty") then
            json_opt = nil
        end
        print(json.encode(result or {}, json_opt))
    end
end
