#!/usr/bin/env lua

local json = require "luci.jsonc"
local fs   = require "nixio.fs"
local sys = require "luci.sys"
local _json = require "cjson"                                                             
local json_safe = require "cjson.safe"                                                   
local util = require "cjson.util"

local methods = {
        getLeds= {
            call = function()
                local data = {}
                local res = {}
                local fs = require "nixio.fs"
                if fs.access("/etc/hwinfo.json") then
                    data = util.file_load("/etc/hwinfo.json")
                    t = _json.decode(data)        
                    for k,v in pairs(t)
                    do                   
                        if(k == "led")                       
                            then         
                              for k1,v1 in pairs(v)
                              do
                                for k2,v2 in pairs(v1)
                                do
                                    for k3,v3 in pairs(v2)
                                    do
                                        if (k3 == "sys_name") then
                                            name=v3
                                            table.insert(res, name)
                                            break  
                                        end                  
                                    end                                       
                                end                                          
                            end                                                  
                            break                                
                        end                            
                    end                       
                else               
                    res="Not found"
                end
                return { results = res}
            end
        }
}


local function parseInput()
    local parse = json.new()
    local done, err

    while true do
        local chunk = io.read(4096)
        if not chunk then
            break
            elseif not done and not err then
            done, err = parse:parse(chunk)
        end
    end

    if not done then
        print(json.stringify({ error = err or "Incomplete input" }))
        os.exit(1)
    end

    return parse:get()
end


local function validateArgs(func, uargs)
    local method = methods[func]
    if not method then
        print(json.stringify({ error = "Method not found" }))
        os.exit(1)
    end

    if type(uargs) ~= "table" then
        print(json.stringify({ error = "Invalid arguments pass" }))
        os.exit(1)
    end

    uargs.ubus_rpc_session = nil
    
    local k, v
    local margs = method.args or {}
    for k, v in pairs(uargs) do
        if margs[k] == nil or
            (v ~= nil and type(v) ~= type(margs[k]))
            then
            print(json.stringify({ error = "Invalid arguments vikas" }))
            os.exit(1)
        end
    end

    return method
end

if arg[1] == "list" then
    local _, method, rv = nil, nil, {}
    for _, method in pairs(methods) do rv[_] = method.args or {} end
    print((json.stringify(rv):gsub(":%[%]", ":{}")))
elseif arg[1] == "call" then
    local args = parseInput()
    local method = validateArgs(arg[2], args)
    local result, code = method.call(args)
    print((json.stringify(result):gsub("^%[%]$", "{}")))
    os.exit(code or 0)
end
