#!/bin/sh /etc/rc.common

. /usr/share/libubox/jshn.sh

START=95
STOP=10

USE_PROCD=1
PROG=/usr/sbin/owsd

owsd_master=
ocpp_enabled=
dlm_master_enabled=

check_ocpp() {
    local result
    local ocpp_running

    # ocpp: soap
    ocpp_enabled=$(find /etc/rc.d/ -name "*ocpp*" | wc -l)
    ubus call service list  '{"name":"ocppdv15"}' | jsonfilter -e '@.ocppdv15.instances.instance1'
    ocpp_running=$(($? == 0))
    ubus call service list  '{"name":"ocppdv16"}' | jsonfilter -e '@.ocppdv16.instances.instance1'
    result=$(($? == 0))
    ocpp_running=$((result | ocpp_running))
    ubus call service list  '{"name":"ocppdv20"}' | jsonfilter -e '@.ocppdv20.instances.instance1'
    result=$(($? == 0))
    ocpp_enabled=$((result | ocpp_running | ocpp_enabled))
    [ $ocpp_enabled -eq 1 ] && {
            backend_url=$(uci get ocppd.internal.backend_url)
            prefix=${backend_url:0:2}
            [[ "$prefix" == "ws" ]]
            ocpp_enabled=$(($? != 0))
    }

}

check_dlm() {
    local result
    # dlm: plant current > 0
    dlm_role=$(ubus call smartchargingd get_status | jsonfilter -e @.role)
    if [ "$dlm_role" == "" ]; then
            result=$(uci get smartchargingd.plant.max_plant_current)
            dlm_master_enabled=$((result > 0))
    else
            [[ "$dlm_role" == "plant" ]]
            dlm_master_enabled=$(($? == 0))
    fi
}

is_owsd_master() {
    local wan_enabled
    local result

    check_ocpp
    check_dlm
    # 3g wan up
    wan_enabled=0
    result=$(ubus call network.interface.wan status | jsonfilter -e '@.up')
    if [ "$result" == "true" ]; then
            wan_enabled=1
    fi
    # check 3g modem+sim -> iccid
    iccid=$(uci get simd.@simd[0].iccid)
    [[ "$iccid" != "" ]]
    sim_enabled=$(($? == 0))
    wan_enabled=$((sim_enabled | wan_enabled))
    #owsd_master=$((ocpp_enabled | dlm_master_enabled | wan_enabled))
    owsd_master=$((ocpp_enabled | dlm_master_enabled))
    #logger "owsd master $owsd_master"
}

handle_port() {
    local config="$1"
    local __resultvar="$2"
    local _args=""
    local port interface origin

    config_get port $config port
    [ -n "$port" ] && _args="$_args -p $port"
    config_get interface $config interface
    [ -n "$interface" ] && _args="$_args -i $interface"
    config_get origin $config origin
    [ -n "$origin" ] && _args="$_args -o ${origin/ / -o }"

    args="$args$_args"
}

start_service() {

    #config_load owsd

    #config_get_bool enabled global enabled 0
    #[ $enabled -eq 0 ] && return

    #config_foreach handle_port port
    is_owsd_master
    logger "owsd master $owsd_master"
    if [ "$owsd_master" == "1" ]; then
        logger "owsd -U -Fhostname"
        uci set owsd.global.role='master'
        procd_open_instance
        procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-0}
        procd_set_param stdout 1
        procd_set_param stderr 1
        procd_set_param command "$PROG" -U -Fhostname
        procd_close_instance
    else
        uci set owsd.global.role='slave'
        procd_open_instance
        procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-0}
        procd_set_param stdout 1
        procd_set_param stderr 1
        procd_set_param command "$PROG" -p7681 -o6* -6
        procd_close_instance
    fi
}

#stop_service() {
#   killall -9 owsd
#}

