Helicopter transform up and down

So i made this C# script,

The avatar (a helicopter) is moved by a click to move script on the gameobject.
The idea is that from a point on the ground, when the player clicks on the terrain world space, the helicopter rotates towards the click point, climbs to a height of 120 along the y axis as it moves ingame.

However, i cannot get it to land once its stopped moving. Ideally, once it reached its location it should start a slow decent until it reached the terrain floor.

Can someone tell me how to fix it.

Edit, adding the landing = true has done nothing to help…

Vector3 targetPosition;
Quaternion playerRot;
Vector3 lookAtTarget;
float rotSpeed = 2f;
float speed = 50f;
bool moving = false;
NavMeshAgent agent;
float landSpeed = 0.1f;
bool landing = false;
Vector3 landPosition;

private void Start()
{
    agent = GetComponent<NavMeshAgent>();
}
private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        SetTargetPosition();
    }
    if (moving)
        Move();
}

private void LateUpdate()
{
    if (landing)
        Land();
}
private void SetTargetPosition()
{
    RaycastHit hit;

    if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 2000))
    {
        targetPosition = hit.point;
        targetPosition = new Vector3(targetPosition.x, 120, targetPosition.z);
        lookAtTarget = new Vector3(targetPosition.x - transform.position.x, 0, targetPosition.z - transform.position.z);
        playerRot = Quaternion.LookRotation(lookAtTarget);
        agent.destination = hit.point;
        moving = true;
    }
}

private void Move()
{
    transform.rotation = Quaternion.Slerp(transform.rotation, playerRot, rotSpeed * Time.deltaTime);

    transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);

    if (transform.position == targetPosition)
       moving = false;
}

private void Land()
{
    if (moving =! true)
    landing = true;

    landPosition = new Vector3(transform.position.x, Terrain.activeTerrain.SampleHeight(transform.position) +4, transform.position.z);
    transform.position = Vector3.MoveTowards(transform.position, landPosition, landSpeed * Time.deltaTime);
    if (transform.position == landPosition)
        landing = false;
}

In your LateUpdate() you are checking for boolean landing to call Land() function, but nowhere in your script you are changing this boolean to true. In the Move() function you are only changing moving boolean to false, but not landing to true.