<?php

declare(strict_types=1);

namespace Xentral\Modules\CopperSurcharge;

use Xentral\Modules\CopperSurcharge\Data\CopperSurchargeData;
use Xentral\Modules\CopperSurcharge\Service\CopperSurchargeCalculator;
use Xentral\Modules\CopperSurcharge\Service\DocumentGateway;
use Xentral\Modules\CopperSurcharge\Service\PurchasePriceGateway;
use Xentral\Modules\CopperSurcharge\Service\DocumentService;
use Xentral\Modules\CopperSurcharge\Service\RawMaterialGateway;
use Xentral\Modules\CopperSurcharge\Wrapper\DocumentPositionWrapper;
use Xentral\Modules\CopperSurcharge\Wrapper\DocumentPositionWrapperInterface;

final class CopperSurchargeCalculatorFactory
{

    /** @var RawMaterialGateway $rawMaterialGateway */
    private $rawMaterialGateway;

    /** @var PurchasePriceGateway $purchasePriceGateway */
    private $purchasePriceGateway;

    /** @var DocumentPositionWrapper $documentPositionWrapper */
    private $documentPositionWrapper;

    /** @var DocumentService $documentPositionService */
    private $documentService;

    /** @var DocumentGateway $documentGateway */
    private $documentGateway;

    /**
     * @param PurchasePriceGateway             $purchasePriceGateway
     * @param RawMaterialGateway               $rawMaterialGateway
     * @param DocumentPositionWrapperInterface $documentPositionWrapper
     * @param DocumentService                  $documentService
     * @param DocumentGateway                  $documentGateway
     */
    public function __construct(
        PurchasePriceGateway $purchasePriceGateway,
        RawMaterialGateway $rawMaterialGateway,
        DocumentPositionWrapperInterface $documentPositionWrapper,
        DocumentService $documentService,
        DocumentGateway $documentGateway
    ) {
        $this->purchasePriceGateway = $purchasePriceGateway;
        $this->rawMaterialGateway = $rawMaterialGateway;
        $this->documentPositionWrapper = $documentPositionWrapper;
        $this->documentService = $documentService;
        $this->documentGateway = $documentGateway;
    }

    /**
     * @param CopperSurchargeData $configData
     *
     * @return CopperSurchargeCalculator
     */
    public function createCopperSurchargeCalculator(CopperSurchargeData $configData): CopperSurchargeCalculator
    {
        return new CopperSurchargeCalculator(
            $this->purchasePriceGateway,
            $this->rawMaterialGateway,
            $this->documentPositionWrapper,
            $this->documentService,
            $this->documentGateway,
            $configData
        );
    }
}