<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\InventoryDistanceBasedSourceSelection\Model\DistanceProvider;

use Magento\InventoryApi\Api\Data\SourceInterface;
use Magento\InventorySourceSelectionApi\Api\Data\AddressInterface;
use Magento\InventoryDistanceBasedSourceSelectionApi\Api\GetDistanceInterface;
use Magento\InventoryDistanceBasedSourceSelectionApi\Api\GetLatLngFromAddressInterface;

/**
 * Class GetDistanceFromSourceToAddress
 */
class GetDistanceFromSourceToAddress
{
    /**
     * @var GetLatLngFromSource
     */
    private $getLatLngFromSource;

    /**
     * @var GetLatLngFromAddressInterface
     */
    private $getLatLngFromAddress;

    /**
     * @var GetDistanceInterface
     */
    private $getDistance;

    /**
     * GetDistanceFromSourceToAddress constructor.
     *
     * @param GetLatLngFromSource $getLatLngFromSource
     * @param GetLatLngFromAddressInterface $getLatLngFromAddress
     * @param GetDistanceInterface $getDistance
     */
    public function __construct(
        GetLatLngFromSource $getLatLngFromSource,
        GetLatLngFromAddressInterface $getLatLngFromAddress,
        GetDistanceInterface $getDistance
    ) {
        $this->getLatLngFromSource = $getLatLngFromSource;
        $this->getLatLngFromAddress = $getLatLngFromAddress;
        $this->getDistance = $getDistance;
    }

    /**
     * Get distance from source to address
     *
     * @param SourceInterface $source
     * @param AddressInterface $address
     * @return float
     */
    public function execute(SourceInterface $source, AddressInterface $address): float
    {
        return $this->getDistance->execute(
            $this->getLatLngFromSource->execute($source),
            $this->getLatLngFromAddress->execute($address)
        );
    }
}