<?php

namespace Illuminate\Database\Console\Migrations;

use Illuminate\Support\Composer;
use Illuminate\Database\Migrations\MigrationCreator;
// namespace a
class MigrateMakeCommand extends BaseCommand
{// MigrateMakeCommand extends BaseCommand
    /**
     * The console command signature.
     *
     * @var string
     */
   // The console command signature.
    protected $signature = 'make:migration {name : The name of the migration.}
        {--create= : The table to be created.}
        {--table= : The table to migrate.}
        {--path= : The location where the migration file should be created.}';
   // too long signature

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create a new migration file';// description

    /**
     * The migration creator instance.
     *
     * @var \Illuminate\Database\Migrations\MigrationCreator
     */
    protected $creator;//The migration creator instance.

    /**
     * The Composer instance.
     *
     * @var \Illuminate\Support\Composer
     */
    protected $composer;// set composer

    /**
     * Create a new migration install command instance.
     *
     * @param  \Illuminate\Database\Migrations\MigrationCreator  $creator
     * @param  \Illuminate\Support\Composer  $composer
     * @return void
     */
    public function __construct(MigrationCreator $creator, Composer $composer)
    {
        parent::__construct();

        $this->creator = $creator;
        $this->composer = $composer;
    }// __construct

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {// fire just execute the console command
        // It's possible for the developer to specify the tables to modify in this
        // schema operation. The developer may also specify if this table needs
        // to be freshly created so we can create the appropriate migrations.
        $name = $this->input->getArgument('name');// get name

        $table = $this->input->getOption('table');// get table

        $create = $this->input->getOption('create');// get create

        if (! $table && is_string($create)) {
            $table = $create;
        }// set table be create

        // Now we are ready to write the migration out to disk. Once we've written
        // the migration out, we will dump-autoload for the entire framework to
        // make sure that the migrations are registered by the class loaders.
        $this->writeMigration($name, $table, $create);
       // a wrap function to migration something and write it.

        $this->composer->dumpAutoloads();// use Auto loads
    }

    /**
     * Write the migration file to disk.
     *
     * @param  string  $name
     * @param  string  $table
     * @param  bool    $create
     * @return string
     */
    protected function writeMigration($name, $table, $create)
    {// write the migration file to disk
        $path = $this->getMigrationPath();// set the path

        $file = pathinfo($this->creator->create($name, $path, $table, $create), PATHINFO_FILENAME);
// get file
        $this->line("<info>Created Migration:</info> $file");
    }// use a big wrap function

    /**
     * Get migration path (either specified by '--path' option or default location).
     *
     * @return string
     */
    protected function getMigrationPath()
    {// Get migration path (either specified by "--path" option or default location)
        if (! is_null($targetPath = $this->input->getOption('path'))) {
            return $this->laravel->basePath().'/'.$targetPath;
        }// get this son class base path

        return parent::getMigrationPath();// use default path.
    }
}