/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *    All rights reserved.
 *
 *    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.
 */

#pragma once

#include "AppConfig.h"
#include "glib.h"
#ifdef QR_CODE_ENABLED
#include "qrcodegen.h"
#include <setup_payload/QRCodeSetupPayloadGenerator.h>
#endif // QR_CODE_ENABLED

#include "demo-ui.h"

#define MAX_STR_LEN 48

class SilabsLCD
{

public:
    typedef enum screen
    {
        DemoScreen = 0,
        StatusScreen,
#ifdef QR_CODE_ENABLED
        QRCodeScreen,
#endif
        InvalidScreen,
    } Screen_e;

    typedef enum icdMode
    {
        NotICD = 0,
        SIT,
        LIT,
    } ICDMode_e;

    typedef struct dStatus
    {
        uint8_t nbFabric     = 0;
        bool connected       = false;
        char networkName[50] = { "TODO" };
        bool advertising     = false;
        ICDMode_e icdMode    = NotICD;
    } DisplayStatus_t;

    typedef void (*customUICB)(GLIB_Context_t * context);
    CHIP_ERROR Init(uint8_t * name = nullptr, bool initialState = false);
    void * Context();
    int Clear(void);
    int DrawPixel(void * pContext, int32_t x, int32_t y);
    int Update(void);
    void WriteDemoUI(bool state);
    void SetCustomUI(customUICB cb);

    void SetScreen(Screen_e screen);
    void CycleScreens(void);
    void SetStatus(DisplayStatus_t & status);
    void WriteStatus();

#ifdef QR_CODE_ENABLED
    void SetQRCode(uint8_t * str, uint32_t size);
    void ShowQRCode(bool show);
#endif

private:
    typedef struct demoState
    {
        bool mainState = false;
        bool protocol1 = false; /* data */
    } DemoState_t;

    void WriteDemoUI();

#ifdef QR_CODE_ENABLED
    void WriteQRCode();
    void LCDFillRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h);
    char mQRCodeBuffer[chip::QRCodeBasicSetupPayloadGenerator::kMaxQRCodeBase38RepresentationLength + 1];
#endif

    GLIB_Context_t glibContext;

#ifdef SL_DEMO_NAME
    uint8_t mName[] = SL_DEMO_NAME
#else
    uint8_t mName[APP_NAME_MAX_LENGTH + 1];
#endif
        customUICB customUI = nullptr;
    DemoState_t dState;

    DisplayStatus_t mStatus;
    uint8_t mCurrentScreen = DemoScreen;
};
