// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#include "CesiumSampleHeightMostDetailedAsyncAction.h"
#include "Cesium3DTileset.h"
#include "CesiumRuntime.h"

/*static*/ UCesiumSampleHeightMostDetailedAsyncAction*
UCesiumSampleHeightMostDetailedAsyncAction::SampleHeightMostDetailed(
    ACesium3DTileset* Tileset,
    const TArray<FVector>& LongitudeLatitudeHeightArray) {
  UCesiumSampleHeightMostDetailedAsyncAction* pAsyncAction =
      NewObject<UCesiumSampleHeightMostDetailedAsyncAction>();
  pAsyncAction->_pTileset = Tileset;
  pAsyncAction->_longitudeLatitudeHeightArray = LongitudeLatitudeHeightArray;

  return pAsyncAction;
}

void UCesiumSampleHeightMostDetailedAsyncAction::Activate() {
  if (!IsValid(this->_pTileset)) {
    TArray<FString> Warnings;
    Warnings.Push(TEXT(
        "Invalid Tileset parameter passed to UCesiumSampleHeightMostDetailedAsyncAction, returning no results"));

    this->RaiseOnHeightsSampled(
        this->_pTileset,
        TArray<FCesiumSampleHeightResult>(),
        Warnings);
  } else {
    this->RegisterWithGameInstance(this->_pTileset);

    this->_pTileset->SampleHeightMostDetailed(
        this->_longitudeLatitudeHeightArray,
        FCesiumSampleHeightMostDetailedCallback::CreateUObject(
            this,
            &UCesiumSampleHeightMostDetailedAsyncAction::
                RaiseOnHeightsSampled));
  }
}

void UCesiumSampleHeightMostDetailedAsyncAction::RaiseOnHeightsSampled(
    ACesium3DTileset* Tileset,
    const TArray<FCesiumSampleHeightResult>& Result,
    const TArray<FString>& Warnings) {
  this->OnHeightsSampled.Broadcast(Result, Warnings);
  this->SetReadyToDestroy();
}