<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

use App\Models\{Photo,Make,Model,Software};

class CreateMakemodelTables extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('makes', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->string('name')->unique();
        });

	    Schema::create('models', function (Blueprint $table) {
		    $table->bigIncrements('id');
		    $table->timestamps();
		    $table->string('name')->nullable();

		    $table->bigInteger('make_id')->unsigned()->nullable();
		    $table->foreign('make_id')->references('id')->on('makes');
		    $table->unique(['name','make_id']);
	    });

	    Schema::create('software', function (Blueprint $table) {
		    $table->bigIncrements('id');
		    $table->timestamps();
		    $table->string('name')->nullable();

		    $table->bigInteger('model_id')->unsigned()->nullable();
		    $table->foreign('model_id')->references('id')->on('models');
		    $table->unique(['name','model_id']);
	    });

	    Schema::table('photo', function (Blueprint $table) {
		    $table->bigInteger('software_id')->unsigned()->nullable();
		    $table->foreign('software_id')->references('id')->on('software');
	    });

	    $po = Photo::select(['make','model','software'])
		    ->groupBy(['make','model','software']);

	    foreach ($po->get() as $o) {
	    	if (! $o->make AND ! $o->model AND ! $o->software)
	    		continue;

	    	$ma = NULL;

	    	dump(['make'=>$o->make,'model'=>$o->model,'software'=>$o->software]);
	    	if ($o->make)
				$ma = Make::firstOrCreate(['name'=>$o->make]);

			$mo = Model::firstOrNew(['name'=>$o->model]);
			if ($ma)
				$mo->make_id = $ma->id;
			$mo->save();

		    $so = Software::firstOrNew(['name'=>$o->software]);
		    if ($so)
			    $so->model_id = $mo->id;
		    $so->save();

		    foreach (Photo::where('make',$o->make)
	             ->where('model',$o->model)
	             ->where('software',$o->software)
	             ->get() as $p) {

		    	$p->software_id = $so->id;
		    	$p->make = $p->model = $p->software = NULL;
		    	$p->save();
		    }
	    }

	    Schema::table('photo', function (Blueprint $table) {
	        $table->dropColumn('make');
		    $table->dropColumn('model');
		    $table->dropColumn('software');
	    });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
	    Schema::table('photo', function (Blueprint $table) {
	        $table->string('make',32)->nullable();
	        $table->string('model',128)->nullable();
		    $table->string('software')->nullable();
	    });

    	foreach (Photo::whereNotNULL('software_id')->get() as $p)
	    {
		    $s = $p->software()->first();
	    	$p->software = $s->name;

	    	if ($s->model)
			    $p->model = $s->model->name;

	    	if ($s->model->make)
		    	$p->make = $s->model->make->name;

	    	$p->software_id = NULL;
	    	$p->save();
	    }

    	Schema::table('photo', function (Blueprint $table) {
    		$table->dropForeign(['software_id']);
    		$table->dropColumn('software_id');
        });

	    Schema::dropIfExists('software');
	    Schema::dropIfExists('models');
	    Schema::dropIfExists('makes');
    }
}