<?phpnamespace Whater\Domain\Whater\Model;use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;use Ramsey\Uuid\Uuid;use Whater\Domain\Common\Exception\InvalidUUIDException;use Whater\Domain\User\Model\User;use Whater\Domain\Whater\Exception\InvalidImportDataFileStatusException;use Whater\Domain\Whater\Exception\InvalidImportDataFileTypeException;/** * Class ImportDataFile * * @package Whater\Domain\Whater\Model */class ImportDataFile implements ContainsRecordedEvents{    use EventRecorderCapabilities;    const STATUS_PENDING = 'STATUS_PENDING';    const STATUS_PROCESING = 'STATUS_PROCESING';    const STATUS_FINISHED = 'STATUS_FINISHED';    const STATUS_CANCELED = 'STATUS_CANCELED';    const STATUS_FAIL = 'STATUS_FAIL';    const FILE_TYPE_WHATERPOINTS_XLS = 'FT_WHATERPOINTS_XLS';    const FILE_TYPE_DISTRIBUTION_NETWORKS_XLSLS = 'FT_DISTRIBUTION_NETWORKS_XLS';    const FILE_TYPE_ESTABLISHMENTS_XLS = 'FT_ESTABLISHMENTS_XLS';    const FILE_TYPE_UBICATIONS_XLS = 'FT_UBICATIONS_XLS';    const FILE_TYPE_TOWN_LOCATIONS_XLS = 'FT_TOWN_LOCATIONS_XLS';    const FILE_TYPE_TOWNS_XLS = 'FT_TOWNS_XLS';    const FILE_TYPE_AGRUPATIONS_XLS = 'FT_AGRUPATIONS_XLS';    const FILE_TYPE_COUNTRY_AREAS_XLS = 'FT_COUNTRY_AREAS_XLS';    const FILE_TYPE_COUNTRIES_XLS = 'FT_COUNTRIES_XLS';    const FILE_TYPE_WHATER_DEVICES_XLS = 'FT_WHATER_DEVICES_XLS';    const FILE_TYPE_USERS_XLS = 'FT_USERS_XLS';    const FILE_TYPE_PARAMETER_ANALYTICAL_XLS = 'FT_PARAMATER_ANALYTICAL_XLS';    /**     * @var string     */    private $uuid;    /**     * @var string     */    private $fileType;    /**     * @var string     */    private $filePath;    /**     * @var string     */    private $fileName;    /**     * @var string     */    private $status;    /**     * @var int     */    private $numRows;    /**     * @var int     */    private $numSuccessRows;    /**     * @var int     */    private $numInvalidRows;    /**     * @var \DateTime     */    private $createdAt;    /**     * @var \DateTime     */    private $updatedAt;    /**     * @var User     */    private $uploadedBy;    /**     * @var array     */    private $notesLines;    public function __construct(        string $importDataFileId = null,        string $fileType,        string $filePath,        string $fileName,        int $numRows,        User $uploadedBy    ) {        try {            $this->uuid = Uuid::fromString($importDataFileId ?: Uuid::uuid4())->toString();        } catch (\InvalidArgumentException $e) {            throw new InvalidUUIDException();        }        switch ($fileType) {            case ImportDataFile::FILE_TYPE_WHATERPOINTS_XLS;            case ImportDataFile::FILE_TYPE_DISTRIBUTION_NETWORKS_XLSLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_UBICATIONS_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_ESTABLISHMENTS_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_TOWN_LOCATIONS_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_TOWNS_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_AGRUPATIONS_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_COUNTRY_AREAS_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_COUNTRIES_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_WHATER_DEVICES_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_USERS_XLS;                $this->fileType = $fileType;                break;            case ImportDataFile::FILE_TYPE_PARAMETER_ANALYTICAL_XLS;                $this->fileType = $fileType;                break;            default:                throw new InvalidImportDataFileTypeException();        }        $this->uploadedBy = $uploadedBy;        $this->filePath = $filePath;        $this->fileName = $fileName;        $this->status = ImportDataFile::STATUS_PENDING;        $this->numRows = $numRows;        $this->numSuccessRows = 0;        $this->numInvalidRows = 0;        $this->notesLines = [];        $this->createdAt = new \DateTime();        $this->updatedAt = new \DateTime();    }    public function updateStatus(        string $status,        int $numSuccessRows,        int $numInvalidRows,        array $notesLines    ) {        switch ($status) {            case ImportDataFile::STATUS_PENDING:            case ImportDataFile::STATUS_CANCELED:            case ImportDataFile::STATUS_PROCESING:            case ImportDataFile::STATUS_FINISHED:            case ImportDataFile::STATUS_FAIL:                $this->status = $status;                break;            default:                throw new InvalidImportDataFileStatusException();        }        $this->numSuccessRows = $numSuccessRows;        $this->numInvalidRows = $numInvalidRows;        $this->notesLines = $notesLines;        $this->updatedAt = new \DateTime();    }    /**     * @return string     */    public function id(): string    {        return $this->uuid;    }    /**     * @return string     */    public function fileType(): string    {        return $this->fileType;    }    /**     * @return string     */    public function fileName(): string    {        return $this->fileName;    }    /**     * @return string     */    public function filePath(): string    {        return $this->filePath;    }    /**     * @return string     */    public function status(): string    {        return $this->status;    }    /**     * @return int     */    public function numRows(): int    {        return $this->numRows;    }    /**     * @return int     */    public function numSuccessRows(): int    {        return $this->numSuccessRows;    }    /**     * @return int     */    public function numInvalidRows(): int    {        return $this->numInvalidRows;    }    /**     * @return int     */    public function numProcessedRows(): int    {        return $this->numInvalidRows + $this->numSuccessRows;    }    /**     * @return int     */    public function uploadedBy(): User    {        return $this->uploadedBy;    }    /**     * @return array     */    public function notesLines(): array    {        return $this->notesLines;    }    /**     * @return  \DateTime     */    public function createdAt(): \DateTime    {        return $this->createdAt;    }    /**     * @return  \DateTime     */    public function updatedAt(): \DateTime    {        return $this->updatedAt;    }    /**     * @return bool     */    public function equals(ImportDataFile $importDataFile)    {        return $this->id() === $importDataFile->id();    }}