<?php

namespace Illuminate\Database\Eloquent\Factories;

/**
 * @template TModel of \Illuminate\Database\Eloquent\Model
 */
class Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var class-string<TModel>
     */
    protected $model;

    /**
     * Get a new factory instance for the given attributes.
     *
     * @param  callable|array<model-property<TModel>, mixed>  $attributes
     * @return static
     */
    public static function new($attributes = []) {}

    /**
     * Create a single model and persist it to the database.
     *
     * @param  array<model-property<TModel>, mixed> $attributes
     * @return TModel
     */
    public function createOne($attributes = []) {}

    /**
     * Create a collection of models and persist them to the database.
     *
     * @param  iterable<callable|array<model-property<TModel>, mixed>>  $records
     * @return \Illuminate\Database\Eloquent\Collection<TModel>
     */
    public function createMany(iterable $records) {}

    /**
     * Create a collection of models and persist them to the database.
     *
     * @param  array<model-property<TModel>, mixed>  $attributes
     * @param  \Illuminate\Database\Eloquent\Model|null  $parent
     * @return \Illuminate\Database\Eloquent\Collection<TModel>|TModel
     */
    public function create($attributes = [], ?\Illuminate\Database\Eloquent\Model $parent = null) {}

    /**
     * Make a single instance of the model.
     *
     * @param  callable|array<model-property<TModel>, mixed>  $attributes
     * @return TModel
     */
    public function makeOne($attributes = []) {}

    /**
     * Create a collection of models.
     *
     * @param  array<model-property<TModel>, mixed>  $attributes
     * @param  \Illuminate\Database\Eloquent\Model|null  $parent
     * @return \Illuminate\Database\Eloquent\Collection<TModel>|TModel
     */
    public function make($attributes = [], ?\Illuminate\Database\Eloquent\Model $parent = null) {}

    /**
     * Make an instance of the model with the given attributes.
     *
     * @param  \Illuminate\Database\Eloquent\Model|null  $parent
     * @return TModel
     */
    protected function makeInstance(?\Illuminate\Database\Eloquent\Model $parent) {}

    /**
     * Define the model's default state.
     *
     * @return array<model-property<TModel>, mixed>
     */
    abstract public function definition();
}
