<?php

namespace App\Service\Prospect;

use App\DTO\ProspectDTO;
use App\Entity\Prospect;
use App\Service\CountryService;
use App\Service\Domain\Builder;
use App\Service\Prospect\Factory\Response;
use App\Service\Prospect\Factory\Status;
use App\Service\ProspectService;
use Throwable;

class Factory
{
    /**
     * @var Builder
     */
    private $domainBuilder;
    private $countryService;
    private $prospectService;

    /**
     * Factory constructor.
     *
     * @param Builder        $domainBuilder
     * @param CountryService $countryService
     * @param                $prospectService
     */
    public function __construct(Builder $domainBuilder, CountryService $countryService, ProspectService $prospectService)
    {
        $this->domainBuilder = $domainBuilder;
        $this->countryService = $countryService;
        $this->prospectService = $prospectService;
    }

    public function make(ProspectDTO $prospectDTO): Response
    {
        $this->domainBuilder->setUrl($prospectDTO->getUrl());

        try {
            $domain = $this->domainBuilder->build();
        } catch (Throwable $e) {
            return new Response($prospectDTO, Status::NOT_CREATED, $e->getMessage());
        }

        $prospect = (new Prospect())
            ->setType('N/A')
            ->setDomain($domain)
            ->setStatus('NEW')
            ->setEmail($prospectDTO->getEmail())
            ->setCountry($this->countryService->get(3))
            ->setGuidelines($prospectDTO->getGuidelines());

        $this->prospectService->save($prospect);

        return new Response($prospectDTO, Status::CREATED, '');
    }
}
