/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * resarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

#include <string.h>
#include <errno.h>
#include "os/mynewt.h"
#include "console/console.h"
#include "shell/shell.h"
#include "hal/hal_gpio.h"
#include "tsl2591/tsl2591.h"
#include "tsl2591_priv.h"
#include "parse/parse.h"

#if MYNEWT_VAL(TSL2591_CLI)

static int tsl2591_shell_cmd(int argc, char **argv);

static struct shell_cmd tsl2591_shell_cmd_struct = {
    .sc_cmd = "tsl2591",
    .sc_cmd_func = tsl2591_shell_cmd
};

static struct sensor_itf g_sensor_itf = {
    .si_type = MYNEWT_VAL(TSL2591_SHELL_ITF_TYPE),
    .si_num = MYNEWT_VAL(TSL2591_SHELL_ITF_NUM),
    .si_addr = MYNEWT_VAL(TSL2591_SHELL_ITF_ADDR),
};

static int
tsl2591_shell_err_too_many_args(char *cmd_name)
{
    console_printf("Error: too many arguments for command \"%s\"\n",
                   cmd_name);
    return EINVAL;
}

static int
tsl2591_shell_err_unknown_arg(char *cmd_name)
{
    console_printf("Error: unknown argument \"%s\"\n",
                   cmd_name);
    return EINVAL;
}

static int
tsl2591_shell_err_invalid_arg(char *cmd_name)
{
    console_printf("Error: invalid argument \"%s\"\n",
                   cmd_name);
    return EINVAL;
}

static int
tsl2591_shell_help(void)
{
    console_printf("%s cmd [flags...]\n", tsl2591_shell_cmd_struct.sc_cmd);
    console_printf("cmd:\n");
    console_printf("\tr    [n_samples]\n");
    console_printf("\tgain [0|1|2|3]\n");
    console_printf("\ttime [100|200|300|400|500|600]\n");
    console_printf("\ten   [0|1]\n");
    console_printf("\tdump\n");

    return 0;
}

static int
tsl2591_shell_cmd_read(int argc, char **argv)
{
    uint16_t full;
    uint16_t ir;
    uint16_t samples;
    uint16_t val;
    float lux;
    int rc;

    samples = 1;

    if (argc > 3) {
        return tsl2591_shell_err_too_many_args(argv[1]);
    }

    /* Check if more than one sample requested */
    if (argc == 3) {
        val = parse_ll_bounds(argv[2], 1, UINT16_MAX, &rc);
        if (rc) {
            return tsl2591_shell_err_invalid_arg(argv[2]);
        }
        samples = val;
    }

    while(samples--) {
        /* Get raw broadband and IR readings */
        rc = tsl2591_get_data(&g_sensor_itf, &full, &ir);
        if (rc) {
            console_printf("Read failed: %d\n", rc);
            return rc;
        }
        /* Get lux estimation */
        lux = tsl2591_calculate_lux_f(&g_sensor_itf, full, ir, NULL);
        console_printf("Lux:   %lu.%lu\n", (uint32_t)lux,
                       (uint32_t)(lux*1000)%1000);
        console_printf("Full:  %u\n", full);
        console_printf("IR:    %u\n", ir);
    }

    return 0;
}

static int
tsl2591_shell_cmd_gain(int argc, char **argv)
{
    uint8_t val;
    uint8_t gain;
    int rc;

    if (argc > 3) {
        return tsl2591_shell_err_too_many_args(argv[1]);
    }

    /* Display the gain */
    if (argc == 2) {
        rc = tsl2591_get_gain(&g_sensor_itf, &gain);
        if (rc) {
            console_printf("Getting gain failed rc:%d", rc);
            goto err;
        }
        switch (gain) {
            case TSL2591_LIGHT_GAIN_LOW:
                console_printf("0 (1x)\n");
            break;
            case TSL2591_LIGHT_GAIN_MED:
                console_printf("1 (25x)\n");
            break;
            case TSL2591_LIGHT_GAIN_HIGH:
                console_printf("2 (428x)\n");
            break;
            case TSL2591_LIGHT_GAIN_MAX:
                console_printf("3 (9876x)\n");
            break;
            default:
                console_printf("ERROR!\n");
            break;
        }
    }

    /* Update the gain */
    if (argc == 3) {
        val = parse_ll_bounds(argv[2], 0, 3, &rc);
        /* Make sure gain is valid */
        if (rc) {
            return tsl2591_shell_err_invalid_arg(argv[2]);
        }
        rc = tsl2591_set_gain(&g_sensor_itf, val << 4);
        if (rc) {
            console_printf("Setting gain failed rc:%d", rc);
        }
    }

err:
    return rc;
}

static int
tsl2591_shell_cmd_time(int argc, char **argv)
{
    uint8_t time;
    long val;
    int rc;

    if (argc > 3) {
        return tsl2591_shell_err_too_many_args(argv[1]);
    }

    /* Display the integration time */
    if (argc == 2) {
        rc = tsl2591_get_integration_time(&g_sensor_itf, &time);
        if (rc) {
            console_printf("Getting integration time failed rc:%d", rc);
            goto err;
        }

        switch (time) {
            case TSL2591_LIGHT_ITIME_100MS:
                console_printf("100\n");
            break;
            case TSL2591_LIGHT_ITIME_200MS:
                console_printf("200\n");
            break;
            case TSL2591_LIGHT_ITIME_300MS:
                console_printf("300\n");
            break;
            case TSL2591_LIGHT_ITIME_400MS:
                console_printf("400\n");
            break;
            case TSL2591_LIGHT_ITIME_500MS:
                console_printf("500\n");
            break;
            case TSL2591_LIGHT_ITIME_600MS:
                console_printf("600\n");
            break;
        }
    }

    /* Set the integration time */
    if (argc == 3) {
        val = parse_ll_bounds(argv[2], 100, 600, &rc);
        /* Make sure val is 100, 200, 300, 400, 500 or 600 */
        if (rc || ((val != 100) && (val != 200) && (val != 300) &&
            (val != 400) && (val != 500) && (val != 600))) {
                return tsl2591_shell_err_invalid_arg(argv[2]);
        }
        switch(val) {
            case 100:
                rc = tsl2591_set_integration_time(&g_sensor_itf, TSL2591_LIGHT_ITIME_100MS);
            break;
            case 200:
                rc = tsl2591_set_integration_time(&g_sensor_itf, TSL2591_LIGHT_ITIME_200MS);
            break;
            case 300:
                rc = tsl2591_set_integration_time(&g_sensor_itf, TSL2591_LIGHT_ITIME_300MS);
            break;
            case 400:
                rc = tsl2591_set_integration_time(&g_sensor_itf, TSL2591_LIGHT_ITIME_400MS);
            break;
            case 500:
                rc = tsl2591_set_integration_time(&g_sensor_itf, TSL2591_LIGHT_ITIME_500MS);
            break;
            case 600:
                rc = tsl2591_set_integration_time(&g_sensor_itf, TSL2591_LIGHT_ITIME_600MS);
            break;
        }

        if (rc) {
            console_printf("Setting integration time failed rc:%d", rc);
        }
    }

err:
    return rc;
}

static int
tsl2591_shell_cmd_en(int argc, char **argv)
{
    char *endptr;
    long lval;
    int rc;
    uint8_t enabled;

    if (argc > 3) {
        return tsl2591_shell_err_too_many_args(argv[1]);
    }

    /* Display current enable state */
    if (argc == 2) {
        rc = tsl2591_get_enable(&g_sensor_itf, &enabled);
        if (rc) {
            console_printf("Enable read failure rc:%d", rc);
            goto err;
        }

        console_printf("%u\n", enabled);
    }

    /* Update the enable state */
    if (argc == 3) {
        lval = strtol(argv[2], &endptr, 10); /* Base 10 */
        if (argv[2][0] != '\0' && *endptr == '\0' &&
            lval >= 0 && lval <= 1) {
            rc = tsl2591_enable(&g_sensor_itf, lval);
            if (rc) {
                console_printf("Could not enable sensor rc:%d", rc);
                goto err;
            }
        } else {
            return tsl2591_shell_err_invalid_arg(argv[2]);
        }
    }

    return 0;
err:
    return rc;
}

static int
tsl2591_shell_print_reg(int reg, char *name)
{
    uint8_t val;
    int rc;

    val = 0;
    rc = tsl2591_read8(&g_sensor_itf,
                      TSL2591_COMMAND_BIT | reg,
                      &val);
    if (rc) {
       goto err;
    }
    console_printf("0x%02X (%s): 0x%02X\n", reg, name, val);

    return 0;
err:
    return rc;
}

static int
tsl2591_shell_cmd_dump(int argc, char **argv)
{
    int rc;

    if (argc > 3) {
        return tsl2591_shell_err_too_many_args(argv[1]);
    }

    /* Dump all the register values for debug purposes */
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_ENABLE, "ENABLE");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_CONTROL, "CONTROL");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_AILTL, "AILTL");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_AILTH, "AILTH");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_AIHTL, "AIHTL");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_AIHTH, "AIHTH");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_NPAILTL, "NPAILTL");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_NPAILTH, "NPAILTH");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_NPAIHTL, "NPAIHTL");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_THRESHOLD_NPAIHTH, "NPAIHTH");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_PERSIST_FILTER, "FILTER");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_PACKAGE_PID, "PACKAGEID");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_DEVICE_ID, "DEVICEID");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_DEVICE_STATUS, "STATUS");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_CHAN0_LOW, "CHAN0_LOW");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_CHAN0_HIGH, "CHAN0_HIGH");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_CHAN1_LOW, "CHAN1_LOW");
    if (rc) {
       goto err;
    }
    rc = tsl2591_shell_print_reg(TSL2591_REGISTER_CHAN1_HIGH, "CHAN1_HIGH");
    if (rc) {
       goto err;
    }

    return 0;
err:
    console_printf("Read failed rc:%d", rc);
    return rc;
}

static int
tsl2591_shell_cmd(int argc, char **argv)
{
    if (argc == 1) {
        return tsl2591_shell_help();
    }

    /* Read command (get a new data sample) */
    if (argc > 1 && strcmp(argv[1], "r") == 0) {
        return tsl2591_shell_cmd_read(argc, argv);
    }

    /* Gain command */
    if (argc > 1 && strcmp(argv[1], "gain") == 0) {
        return tsl2591_shell_cmd_gain(argc, argv);
    }

    /* Integration time command */
    if (argc > 1 && strcmp(argv[1], "time") == 0) {
        return tsl2591_shell_cmd_time(argc, argv);
    }

    /* Enable */
    if (argc > 1 && strcmp(argv[1], "en") == 0) {
        return tsl2591_shell_cmd_en(argc, argv);
    }

    /* Debug */
    if (argc > 1 && strcmp(argv[1], "dump") == 0) {
        return tsl2591_shell_cmd_dump(argc, argv);
    }

    return tsl2591_shell_err_unknown_arg(argv[1]);
}

int
tsl2591_shell_init(void)
{
    int rc;

    rc = shell_cmd_register(&tsl2591_shell_cmd_struct);
    SYSINIT_PANIC_ASSERT(rc == 0);

    return rc;
}

#endif
