<?php

declare(strict_types=1);

namespace Modules\Develop\Support\Generate\Create;

use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Support\Facades\File;

/**
 * creator
 */
abstract class Creator
{
    /**
     * @var string
     */
    protected string $ext = '.php';

    /**
     * @var string
     */
    protected string $module;

    /**
     * @var string
     */
    protected string $file;

    /**
     * create
     *
     * @return bool|string
     * @throws FileNotFoundException
     */
    public function create(): bool|string
    {
        return $this->put();
    }

     /**
      * the file which content put in
      *
      * @return string
      */
     abstract public function getFile(): string;

    /**
     * get content
     * @return string|bool
     */
    abstract public function getContent(): string|bool;

    /**
     * @return string|bool
     * @throws FileNotFoundException
     */
    protected function put(): string|bool
    {
        if (! $this->getContent()) {
            return false;
        }

        $this->file = $this->getFile();

        File::put($this->file, $this->getContent());

        if (File::exists($this->file)) {
            return $this->file;
        }

        throw new FileNotFoundException("create [$this->file] failed");
    }


    /**
     * set ext
     *
     * @param string $ext
     * @return $this
     */
    protected function setExt(string $ext): static
    {
        $this->ext = $ext;

        return $this;
    }


    /**
     * set module
     *
     * @param string $module
     * @return $this
     */
    public function setModule(string $module): static
    {
        $this->module = $module;

        return $this;
    }

    /**
     * get file
     *
     * @return string
     */
    public function getGenerateFile(): string
    {
        return $this->file;
    }
}