/*
 * Copyright (C) 2018-2020 Intel Corporation.
 *
 * 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

extern "C" {
#include <ia_css_program_group_data.h>
#include <ia_css_program_group_param.h>
#include <ia_css_psys_process_group.h>
#include <ia_css_psys_program_group_manifest.h>
#include <ia_css_psys_terminal.h>
#include <ia_css_psys_terminal_manifest.h>
#include <ia_css_terminal_manifest_types.h>
#include <ia_css_terminal_types.h>
#include <ia_isp_bxt.h>
#include <ia_isp_types.h>
#include <ia_p2p.h>
#include <ia_p2p_types.h>
#include <ia_pal_types_isp_ids_autogen.h>
#include <pg_control_init_framework.h>
}

#include <map>
#include <memory>
#include <vector>

#include "ia_tools/css_types.h"
#include "iutils/Errors.h"
#include "iutils/Utils.h"
#include "modules/ia_cipr/include/Utils.h"
#include "src/core/psysprocessor/PGUtils.h"

namespace icamera {

#define PSYS_MAX_KERNELS_PER_PG IA_CSS_KERNEL_BITMAP_BITS

/**
 * \class IntelPGParam
 *
 * \brief This is a version P2P implementation which is used to encode parameter terminal
 *        and decode statistic terminal for PSYS pipeline.
 *
 * The call sequence as follows:
 * 1. init();
 * 2. prepare();
 * 3. allocatePGBuffer() (optional);
 * 4. setPGAndPrepareProgram();
 * 5. getPayloadSizes(), and allocate payload buffers,
 *    allocatePayloads() is provided for that;
 * 6. getFragmentDescriptors();
 * 7. loop frame {
 *      updatePALAndEncode();
 *      decode();
 *    }
 * 8. deinit();
 */
class IntelPGParam {
 public:
    explicit IntelPGParam(int pgId);
    ~IntelPGParam();

    /**
     * Use to init and config P2P handle.
     */
    int init(ia_p2p_platform_t platform, const PgConfiguration& Pgconfiguration);

    /**
     * Query and save the requirement for each terminal, calculate the final kernel bitmap.
     */
    int prepare(const ia_binary_data* ipuParameters, const ia_css_rbm_t* rbm,
                ia_css_kernel_bitmap_t* bitmap, uint32_t* maxStatsSize = nullptr);

    /**
     * Allocate PG buffer for caller
     */
    void* allocatePGBuffer(int pgSize);

    /**
     * Accept pg outside and init program_control_init terminal.
     */
    int setPGAndPrepareProgram(ia_css_process_group_t* pg);

    /**
     * Allocate payload memory for terminals.
     */
    int allocatePayloads(int payloadCount, ia_binary_data* payloads);

    /**
     * Update PAL and encode payload data for all terminals. Will skip inactive terminals.
     */
    int updatePALAndEncode(const ia_binary_data* ipuParams, int payloadCount,
                           ia_binary_data* payloads);

    /**
     * Decode payload data for all related terminals.
     */
    int decode(int payloadCount, ia_binary_data* payload, ia_binary_data* statistics);

    /**
     * Use to deinit P2P handle.
     */
    void deinit();

    /**
     * Get fragment descriptors calculated according to PAL data
     * Called after prepare().
     */
    int getFragmentDescriptors(int descCount, ia_p2p_fragment_desc* descs);

    /**
     * Get payload size for all terminals, and return valid payloads number.
     */
    int getPayloadSizes(int payloadCount, ia_binary_data* payloads);

 private:
    enum FragmentDataTerminalType {
        FRAG_TERM_TYPE_INPUT = 0,
        FRAG_TERM_TYPE_OUTPUT_START,  // Mapping to data out terminal in order for all postgdc pgs.
        FRAG_TERM_TYPE_DISPALY_OUTPUT = FRAG_TERM_TYPE_OUTPUT_START,
        FRAG_TERM_TYPE_MAIN_OUTPUT,
        FRAG_TERM_TYPE_PP_OUTPUT,
        FRAG_TERM_TYPE_COUNT,
    };

    int mPgId;
    int mTerminalCount;
    PgFrameDesc mInputMainFrame;
    PgFrameDesc mOutputMainFrame;

    uint8_t mFragmentCount;
    ia_p2p_fragment_desc* mFragmentDesc;
    ia_p2p_fragment_configuration_t* mFragmentConfig;
    // for pg fragment with new api:
    // ia_p2p_calculate_fragments_rbm
    // Instead of mFragmentDesc
    ia_p2p_handle mP2pHandle;
    ia_binary_data mP2pCacheBuffer;

    ia_css_program_group_manifest_t* mPgManifest;
    std::vector<int> mDisableDataTermials;
    ia_css_process_group_t* mProcessGroup;
    int mProgramControlInitTerminalIndex;

    struct IpuPgTerminalKernelInfo {
        IpuPgTerminalKernelInfo() {}
        uint8_t id = 0;
        uint8_t sections = 0;
        uint32_t size = 0;
        bool initialize = false;
    };

    struct IpuPgTerminaRequirements {
        IpuPgTerminaRequirements() { kernelBitmap = ia_css_kernel_bitmap_clear(); }
        ia_css_terminal_type_t type = IA_CSS_N_TERMINAL_TYPES;
        uint32_t payloadSize = 0;
        ia_css_kernel_bitmap_t kernelBitmap;
        uint32_t sectionCount = 0;
        IpuPgTerminalKernelInfo* kernelOrder = nullptr;
        ia_p2p_fragment_desc* fragment_descs = nullptr;

        // Use for program_control_init
        uint32_t userParamSize;
        std::unique_ptr<uint8_t[]> userParamAddress;
    };

    struct IpuPgRequirements {
        IpuPgRequirements() { CLEAR(terminals); }
        uint32_t terminalCount = 0;
        IpuPgTerminaRequirements terminals[IPU_MAX_TERMINAL_COUNT];
    };

    struct KernelRequirement {
        KernelRequirement() { mKernelBitmap = ia_css_kernel_bitmap_clear(); }
        ia_p2p_terminal_requirements_t mSections[PSYS_MAX_KERNELS_PER_PG];
        ia_p2p_payload_desc mPayloads[PSYS_MAX_KERNELS_PER_PG];
        int mPayloadSize = 0;
        ia_css_kernel_bitmap_t mKernelBitmap;
    };

    KernelRequirement mKernel;
    IpuPgRequirements mPgReqs;

    // Allocate them here, for sandboxing case (shared memory)
    std::vector<ia_binary_data> mAllocatedPayloads;
    void* mProcessGroupMemory;

 private:
    int getKernelIdByBitmap(ia_css_kernel_bitmap_t bitmap);
    ia_css_kernel_bitmap_t getCachedTerminalKernelBitmap(
        ia_css_param_terminal_manifest_t* manifest);
    ia_css_kernel_bitmap_t getProgramTerminalKernelBitmap(
        ia_css_program_terminal_manifest_t* manifest);
    int disableZeroSizedTerminals(ia_css_kernel_bitmap_t* kernelBitmap);
    css_err_t getKernelOrderForProgramTerm(ia_css_program_terminal_manifest_t* terminalManifest,
                                           IpuPgTerminalKernelInfo* kernelOrder);
    css_err_t getKernelOrderForParamCachedInTerm(ia_css_param_terminal_manifest_t* terminalManifest,
                                                 IpuPgTerminalKernelInfo* kernelOrder);
    int8_t terminalEnumerateByType(IpuPgRequirements* reqs, ia_css_terminal_type_t terminalType,
                                   uint8_t num);
    int8_t terminalEnumerateByBitmap(IpuPgRequirements* reqs, ia_css_terminal_type_t terminal_type,
                                     ia_css_kernel_bitmap_t bitmap);
    bool isKernelIdInKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId,
                                 uint8_t* orderedIndex);
    uint32_t getKernelCountFromKernelOrder(IpuPgRequirements* reqs, int8_t termIndex, int kernelId);
    void processTerminalKernelRequirements(IpuPgRequirements* reqs, int8_t termIndex,
                                           ia_css_terminal_type_t terminalType, int kernelId);
    css_err_t payloadSectionSizeSanityTest(ia_p2p_payload_desc* current, uint16_t kernelId,
                                           uint8_t terminalIndex, uint32_t currentOffset,
                                           size_t payloadSize);

    int calcFragmentDescriptors(int fragmentCount, const PgFrameDesc& inputMainFrame,
                                const PgFrameDesc& outputMainFrame, const ia_css_rbm_t* rbm);

    void dumpFragmentDesc(int fragmentCount);
    int encodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
    int decodeTerminal(ia_css_terminal_t* terminal, ia_binary_data payload);
    int serializeDecodeCache(ia_binary_data* result);

    void destroyPayloads();
    void destroyPGBuffer();

    DISALLOW_COPY_AND_ASSIGN(IntelPGParam);
};

}  // namespace icamera
