#!/usr/bin/python3
# @file
# @ingroup py
# @copyright
#   SPDX-FileCopyrightText: 2026 European Southern Observatory (ESO)
#   SPDX-License-Identifier: LGPL-3.0-only

import click
import time
import random

from DdtUtils import DdtLogger
import DdtDataTransfer as ddtDataTransfer


def initializeMetadata(metadata_info):
    # Base Information
    metadata_info.meta_data_base.bytes_per_pixel = 4
    metadata_info.meta_data_base.number_dimensions = 1
    metadata_info.meta_data_base.byte_order_little_endian = True
    metadata_info.meta_data_base.complete_flag = True
    metadata_info.meta_data_base.last_segment = True
    metadata_info.meta_data_base.data_type = 0  # UINT8
    metadata_info.meta_data_base.description = "Randomizer sample number. See code."

    # Specific Information
    metadata_info.array_dimensions = "1156"
    metadata_info.labels = "Randomizer sample number. See code."
    metadata_info.configuration_map_name = "Randomizer sample number. See code."


@click.command()
@click.option('-u', "--uri", help="DDT Broker URI")
@click.option("-d", "--datastream", help="Data stream name for the publisher")
@click.option("-r", "--max_random_value", default=100, help="Randomize values from zero to define max, default value: 100")
@click.option("-i", "--interval", default=500, type=float, help="Period or transmot next sample in milliseconds, default value: 500")
@click.option("-s", "--max_data_size", default=1, help="Data size for publisher buffer, default value: 1")
@click.option("-n", "--samples_number", default=4, help="Max samples the publisher buffer can store, default value: 4")
def main(uri, datastream, max_random_value, interval, max_data_size, samples_number):
    # Logger instantiation
    ddt_logger = DdtLogger("DdtSamplePublisher")
    ddt_logger.Configure("DdtSamplePublisher")
    ddt_logger.Write(2, "DDT Sample Publisher was started.")

    # Publisher instantiation
    ddt_publisher = ddtDataTransfer.DdtDataPublisher(ddt_logger)

    # Add publisher, check the status and set default buffer size values
    ddt_publisher.SetBufferSize(max_data_size, samples_number)
    status = ddt_publisher.RegisterPublisher(
        broker_uri=uri,
        data_stream_identifier=datastream)

    # Only update internal information if connections is ok
    if status == 1:

        # Encoder and Decoder object
        ddt_encdec_binary_dimension = ddtDataTransfer.DdtEncDecBinaryxD()
        ddt_publisher.set_topic_id(ddt_encdec_binary_dimension.get_topic_id())

        # Metadata for binary samples. Maybe we need to set some internal parameters
        # for publisher to understand what is going on. Initialization should be given
        # if samples are also an input
        ddt_metadata_elements = ddtDataTransfer.MetaDataElementsBinaryxD()
        initializeMetadata(ddt_metadata_elements)

        sample_id = 0
        while ddt_publisher.get_connected_to_broker():
            # Create random list with one element
            random_number = random.randint(0, max_random_value)
            random_list = [random_number]

            # Encode data with respective metadata information
            ddt_encdec_binary_dimension.Encode(ddt_metadata_elements)

            # Send data
            metadata = ddt_encdec_binary_dimension.get_meta_data()
            ddt_publisher.WriteData(sample_id, random_list, metadata)
            ddt_publisher.PublishData()

            # Count the sample and wait a bit in milliseconds
            sample_id = sample_id + 1
            time.sleep(interval/1000)

    else:
        ddt_logger.Write(
            2, f"Error {status} when connecting with the DDT Broker {uri} {datastream}")


if __name__ == "__main__":
    main()
