Covivo/mobicoop

View on GitHub
api/src/Incentive/Service/HonourCertificateService.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Incentive\Service;

use App\Incentive\Entity\LongDistanceSubscription;
use App\Incentive\Entity\ShortDistanceSubscription;
use App\User\Entity\User;

class HonourCertificateService
{
    public const HONOUR_CERTIFICATE_PATH = __DIR__.'/../Resource/certificates';
    public const HONOUR_CERTIFICATE_EXTENSION = '.txt';
    public const LONG_DISTANCE_SPECIFIC_PATH = '/long-distance-honour-certificate';
    public const SHORT_DISTANCE_SPECIFIC_PATH = '/short-distance-honour-certificate';

    /**
     * @var User
     */
    private $_driver;

    /**
     * @var bool
     */
    private $_longDistance;

    /**
     * @var string
     */
    private $_certificate;

    public function __construct() {}

    /**
     * @param LongDistanceSubscription|ShortDistanceSubscription $subscription
     */
    public function generateHonourCertificate($subscription): string
    {
        $this->setDriver($subscription->getUser());

        $this->_longDistance = $subscription instanceof LongDistanceSubscription;

        $this->_getCertificate();
        $this->_parseCertificate();

        return $this->_certificate;
    }

    public function setDriver(User $driver): self
    {
        $this->_driver = $driver;

        return $this;
    }

    private function _getCertificate()
    {
        $filename = self::HONOUR_CERTIFICATE_PATH;

        switch ($this->_longDistance) {
            case false:
                $filename .= self::SHORT_DISTANCE_SPECIFIC_PATH;

                break;

            default:
                $filename .= self::LONG_DISTANCE_SPECIFIC_PATH;

                break;
        }

        $this->_certificate = file_get_contents($filename.self::HONOUR_CERTIFICATE_EXTENSION);

        return $this->_certificate;
    }

    private function _parseCertificate()
    {
        $now = new \DateTime();

        $fields = [
            'NomConducteur' => $this->_driver->getFamilyName(),
            'PrenomConducteur' => $this->_driver->getGivenName(),
            'AdresseConducteur' => !is_null($this->_driver->getHomeAddress()) ? $this->_driver->getHomeAddress()->getStreetAddress() : null,
            'ComplementAdresseConducteur' => null,
            'CodePostalConducteur' => !is_null($this->_driver->getHomeAddress()) ? $this->_driver->getHomeAddress()->getPostalCode() : null,
            'VilleConducteur' => !is_null($this->_driver->getHomeAddress()) ? $this->_driver->getHomeAddress()->getAddressLocality() : null,
            'PaysConducteur' => !is_null($this->_driver->getHomeAddress()) ? $this->_driver->getHomeAddress()->getAddressCountry() : null,
            'TelephoneConducteur' => $this->_driver->getTelephone(),
            'CourrielConducteur' => $this->_driver->getEmail(),
            'DateAttestationHonneur' => $now->format('d-m-Y'),
        ];

        foreach ($fields as $field => $value) {
            $this->_certificate = str_replace('{{'.$field.'}}', $value, $this->_certificate);
        }

        return $this->_certificate;
    }
}