#include <string.h>
#include <stdint.h>
#include <cutils/properties.h>
#include <unistd.h>

#include "mbtk_type.h"
#include "mbtk_utils.h"

#include "mbtk_device.h"

/*
* Exec shell command.
*/

static bool shell_cmd_exec(const char *cmd, char *buf, int buf_size){
    FILE *fcmd;
    bool result = FALSE;
    fcmd = popen(cmd, "r");
    memset(buf, 0, buf_size);
    if(fcmd)
    {
        int pos = 0;
        int len = 0;

        while(!ferror(fcmd) && !feof(fcmd))
        {
            if(buf_size - pos == 0)
            {
                break;
            }
            len = fread(buf + pos,1,buf_size - pos,fcmd);
            if(len > 0)
                pos += len;
        }

        if(buf_size == pos)
            buf[buf_size - 1] = '\0';

        pclose(fcmd);
        result = TRUE;
    }

//    LOGV("%s [result:%d]: %s",cmd,result,buf);

    return result;
}


static char* band_2_str(mbtk_modem_band_area_enum band_area)
{
    switch(band_area)
    {
        case MBTK_MODEM_BAND_AREA_CN:
            return "CN";
        case MBTK_MODEM_BAND_AREA_EU:
            return "EU";
        case MBTK_MODEM_BAND_AREA_SA:
            return "SA";
        default:
            return "ALL";
    }
}

static char* net_support_str_get(uint32 net_support)
{
    static char net_str[100] = {0};

    if(net_support & MBTK_NET_SUPPORT_2G) { // GSM
        if(strlen(net_str) > 0) {
            strcat(net_str, "/2G");
        } else {
            strcat(net_str, "2G");
        }
    }

    if(net_support & MBTK_NET_SUPPORT_3G) { // WCDMA
        if(strlen(net_str) > 0) {
            strcat(net_str, "/3G");
        } else {
            strcat(net_str, "3G");
        }
    }

    if(net_support & MBTK_NET_SUPPORT_4G) { // LTE
        if(strlen(net_str) > 0) {
            strcat(net_str, "/4G");
        } else {
            strcat(net_str, "4G");
        }
    }

    if(net_support & MBTK_NET_SUPPORT_5G) { // NR
        if(strlen(net_str) > 0) {
            strcat(net_str, "/5G");
        } else {
            strcat(net_str, "5G");
        }
    }
    return net_str;
}

static char* band_str_get(uint32 band, int index)
{
    int band_list[33] = {0};
    int ret = mbtk_band_2_list(band, index, band_list);
    if(ret > 0) {
        static char buff[150] = {0};
        memset(buff, 0, sizeof(buff));
        int i = 0;
        while(i < ret) {
            if(strlen(buff) > 0) {
                sprintf(buff + strlen(buff), "/b%d", band_list[i]);
            } else {
                sprintf(buff + strlen(buff), "b%d", band_list[i]);
            }
            i++;
        }
        return buff;
    } else {
        return "NON";
    }
}

static void band_support_init(mbtk_device_info_modem_t *info_modem)
{
    memset(info_modem, 0, sizeof(mbtk_device_info_modem_t));
    if(mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_MODEM, info_modem, sizeof(mbtk_device_info_modem_t))) {
        printf("mbtk_dev_info_read(MODEM) fail, use default band.\n");
        info_modem->version = DEV_INFO_VERSION_V2;
        info_modem->modem.v2.band_area = MBTK_MODEM_BAND_AREA_ALL;
#ifdef MBTK_5G_SUPPORT
        info_modem->modem.v2.net_pref = 19; // MBTK_NET_PREF_LTE_NR_NR_PREF
        info_modem->modem.v2.net_support = MBTK_NET_SUPPORT_4G | MBTK_NET_SUPPORT_5G;

        info_modem->modem.v2.band_gsm = 0;
        info_modem->modem.v2.band_wcdma = 0;
        info_modem->modem.v2.band_tdlte = MBTK_BAND_ALL_TDLTE_DEFAULT;
        info_modem->modem.v2.band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
        info_modem->modem.v2.band_lte_ext = MBTK_BAND_ALL_EXT_LTE_DEFAULT;

        info_modem->modem.v2.band_nr_3 = MBTK_BAND_ALL_NR_3_DEFAULT;
        info_modem->modem.v2.band_nr_2 = MBTK_BAND_ALL_NR_2_DEFAULT;
        info_modem->modem.v2.band_nr_1 = MBTK_BAND_ALL_NR_1_DEFAULT;
        info_modem->modem.v2.band_nr_0 = MBTK_BAND_ALL_NR_0_DEFAULT;
#else
        info_modem->modem.v2.net_pref = 15; // MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF
        info_modem->modem.v2.net_support = MBTK_NET_SUPPORT_2G | MBTK_NET_SUPPORT_3G | MBTK_NET_SUPPORT_4G;

        info_modem->modem.v2.band_gsm = MBTK_BAND_ALL_GSM_DEFAULT;
        info_modem->modem.v2.band_wcdma = MBTK_BAND_ALL_WCDMA_DEFAULT;
        info_modem->modem.v2.band_tdlte = MBTK_BAND_ALL_TDLTE_DEFAULT;
        info_modem->modem.v2.band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
        info_modem->modem.v2.band_lte_ext = MBTK_BAND_ALL_EXT_LTE_DEFAULT;

        info_modem->modem.v2.band_nr_3 = 0;
        info_modem->modem.v2.band_nr_2 = 0;
        info_modem->modem.v2.band_nr_1 = 0;
        info_modem->modem.v2.band_nr_0 = 0;
#endif
    }
}

static int band_set_by_at(mbtk_device_info_modem_t *band)
{
    char cmd[100] = {0};
    char rsp[100] = {0};

    // Only support 4G/5G
    if(band->modem.v2.net_support & MBTK_NET_SUPPORT_5G) {
        // AT*band=19,0,0,482,134742231,0,24576,256,134217877,0
        if(band->modem.v2.band_lte_ext > 0) {
            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0,,,,%d", band->modem.v2.net_pref, band->modem.v2.band_gsm,
                band->modem.v2.band_wcdma, band->modem.v2.band_tdlte, band->modem.v2.band_fddlte,
                band->modem.v2.band_nr_3, band->modem.v2.band_nr_2, band->modem.v2.band_nr_1,
                band->modem.v2.band_nr_0, band->modem.v2.band_lte_ext);
        } else {
            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0", band->modem.v2.net_pref, band->modem.v2.band_gsm,
                band->modem.v2.band_wcdma, band->modem.v2.band_tdlte, band->modem.v2.band_fddlte,
                band->modem.v2.band_nr_3, band->modem.v2.band_nr_2, band->modem.v2.band_nr_1, band->modem.v2.band_nr_0);
        }
    } else {
        if(band->modem.v2.band_lte_ext > 0) {
            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,,,,%d", band->modem.v2.net_pref, band->modem.v2.band_gsm, band->modem.v2.band_wcdma,
                band->modem.v2.band_tdlte, band->modem.v2.band_fddlte, band->modem.v2.band_lte_ext);
        } else {
            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d", band->modem.v2.net_pref, band->modem.v2.band_gsm, band->modem.v2.band_wcdma, band->modem.v2.band_tdlte, band->modem.v2.band_fddlte);
        }
    }

    if(shell_cmd_exec(cmd, rsp, sizeof(rsp))) {
        if(strstr(rsp, "\r\nOK\r\n")) {
            return 0;
        } else {
            return -1;
        }
    } else {
        return -1;
    }
}

/*
AT*BAND=15,78,147,482,134742231

OK
*/
static int band_config(mbtk_device_info_modem_t *info_modem)
{
    if(band_set_by_at(info_modem))
    {
        return -1;
    }
    else // Set band success.
    {
        if(info_modem->modem.v2.band_area == MBTK_MODEM_BAND_AREA_CN) {
            property_set("persist.mbtk.band_config", "CN");
        } else if(info_modem->modem.v2.band_area == MBTK_MODEM_BAND_AREA_EU) {
            property_set("persist.mbtk.band_config", "EU");
        } else if(info_modem->modem.v2.band_area == MBTK_MODEM_BAND_AREA_SA) {
            property_set("persist.mbtk.band_config", "SA");
        } else {
            property_set("persist.mbtk.band_config", "ALL");
        }
//        LOGD("Set band success.");
        return 0;
    }
}

int main(int argc, char *argv[])
{
    if(argc > 1 && strcmp(argv[1], "band_set") == 0) {
        char buff[10];
        memset(buff, 0, 10);
        property_get("persist.mbtk.band_config", buff, "");
        if(strlen(buff) == 0) {
            bool band_set_success = FALSE;

            mbtk_device_info_modem_t info_modem;
            band_support_init(&info_modem);

            while(!band_set_success) {
                // Set band.
                if(band_config(&info_modem)) {
                    printf("band_config() fail,will waitting 5s to retry...\n");
                    sleep(5);
                } else {
                    break;
                }
            }
            printf("Set band success.\n");
        }
    } else {
        mbtk_device_info_basic_t info_basic;
        memset(&info_basic, 0, sizeof(mbtk_device_info_basic_t));
        int result = mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));
        if(result) {
            printf("mbtk_dev_info_read(BASIC) fail.\n");
            return -1;
        }

        /*
        uint8 project[16];          // T108 / L508_X6
            uint8 project_cust[16];     // T108_C1 / L508_X6_C1  (Refer to: Custom_Model in blf file.)
            uint32 ab_support;          // 1 for ab
            uint8 revision_out[48];     // L508_X6v01.01b04.00
            uint8 revision_in[64];
        */
        printf("Version:%d\n", info_basic.version);
        if(info_basic.version == DEV_INFO_VERSION_V1) {
            printf("Dev_info.version:%d\n", info_basic.version);
            printf("Project:%s\n", info_basic.basic.v1.project);
            printf("Custom_Model:%s\n", info_basic.basic.v1.project_cust);
            printf("Revision_Out:%s\n", info_basic.basic.v1.revision_out);
            printf("Revision_In:%s\n", info_basic.basic.v1.revision_in);
            printf("Build_Time:%s\n", info_basic.basic.v1.build_time);
            printf("AB System:%s\n", info_basic.basic.v1.ab_support ? "Yes" : "No");
            printf("Reboot flag:%d\n", info_basic.basic.v1.reboot_flag);
        } else {
	
            printf("Dev_info.version:%d\n", info_basic.version);
            printf("Project:%s\n", info_basic.basic.v2.project);
            printf("Custom_Model:%s\n", info_basic.basic.v2.project_cust);
            printf("Revision_Out:%s\n", info_basic.basic.v2.revision_out);
            printf("Revision_In:%s\n", info_basic.basic.v2.revision_in);
            printf("Build_Time:%s\n", info_basic.basic.v2.build_time);
            printf("AB System:%s\n", info_basic.basic.v2.ab_support ? "Yes" : "No");
            printf("Reboot flag:%d\n", info_basic.basic.v2.reboot_flag);
            printf("ASR Baseline:%s\n", info_basic.basic.v2.asr_baseline);
        }

        mbtk_device_info_modem_t info_modem;
        memset(&info_modem, 0, sizeof(mbtk_device_info_modem_t));
        result = mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_MODEM, &info_modem, sizeof(mbtk_device_info_modem_t));
        if(result) {
            printf("mbtk_dev_info_read(MODEM) fail.\n");
            return -1;
        }

        if(info_modem.version == DEV_INFO_VERSION_V1) {
            printf("Band:%s\n", band_2_str(info_modem.modem.v1.band_area));
            printf("Band GSM:0x%08x(%s)\n", info_modem.modem.v1.band_gsm, band_str_get(info_modem.modem.v1.band_gsm, 0));
            printf("Band WCDMA:0x%08x(%s)\n", info_modem.modem.v1.band_wcdma, band_str_get(info_modem.modem.v1.band_wcdma, 0));
            printf("Band TDLTE:0x%08x(%s)\n", info_modem.modem.v1.band_tdlte, band_str_get(info_modem.modem.v1.band_tdlte, 1));
            printf("Band FDDLTE:0x%08x(%s)\n", info_modem.modem.v1.band_fddlte, band_str_get(info_modem.modem.v1.band_fddlte, 0));
            printf("Band EXT_LTE:0x%08x(%s)\n", info_modem.modem.v1.band_lte_ext, band_str_get(info_modem.modem.v1.band_lte_ext, 0));
        } else {
            printf("net_pref:%d\n", info_modem.modem.v2.net_pref);
            printf("net_support:%s\n", net_support_str_get(info_modem.modem.v2.net_support));
            printf("Band:%s\n", band_2_str(info_modem.modem.v2.band_area));
            printf("Band GSM:0x%08x(%s)\n", info_modem.modem.v2.band_gsm, band_str_get(info_modem.modem.v2.band_gsm, 0));
            printf("Band WCDMA:0x%08x(%s)\n", info_modem.modem.v2.band_wcdma, band_str_get(info_modem.modem.v2.band_wcdma, 0));
            printf("Band TDLTE:0x%08x(%s)\n", info_modem.modem.v2.band_tdlte, band_str_get(info_modem.modem.v2.band_tdlte, 1));
            printf("Band FDDLTE:0x%08x(%s)\n", info_modem.modem.v2.band_fddlte, band_str_get(info_modem.modem.v2.band_fddlte, 0));
            printf("Band EXT_LTE:0x%08x(%s)\n", info_modem.modem.v2.band_lte_ext, band_str_get(info_modem.modem.v2.band_lte_ext, 0));
            printf("Band NR_3:0x%08x(%s)\n", info_modem.modem.v2.band_nr_3, band_str_get(info_modem.modem.v2.band_nr_3, 3));
            printf("Band NR_2:0x%08x(%s)\n", info_modem.modem.v2.band_nr_2, band_str_get(info_modem.modem.v2.band_nr_2, 2));
            printf("Band NR_1:0x%08x(%s)\n", info_modem.modem.v2.band_nr_1, band_str_get(info_modem.modem.v2.band_nr_1, 1));
            printf("Band NR_0:0x%08x(%s)\n", info_modem.modem.v2.band_nr_0, band_str_get(info_modem.modem.v2.band_nr_0, 0));
        }
    }
    return 0;
}


