<?php

namespace App\Console\Commands;

use App\Models\Frame;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class FrameImport extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'frame:import {frame} {index} {file} '.
        '{--cost=0 : Frame Cost }'.
        '{--mode=1 : Frame Emulation Mode }'.
        '{--replace : Replace existing frame}'.
        '{--type=i : Frame Type}'.
        '{--trim : Trim off header (first 40 chars)}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Import frames into the database. The frames should be in binary format.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

	/**
	 * Execute the console command.
	 *
	 * @return mixed
	 * @throws \Exception
	 */
    public function handle()
    {
		if (! is_numeric($this->argument('frame')))
			throw new \Exception('Frame is not numeric: '.$this->argument('frame'));

		if (strlen($this->argument('index')) != 1 OR ! preg_match('/^[a-z]$/',$this->argument('index')))
			throw new \Exception('Subframe failed validation');

		if (! file_exists($this->argument('file')))
			throw new \Exception('File not found: '.$this->argument('file'));

		$o = new Frame;
		if ($this->option('replace')) {
			try {
				$o = $o->where('frame',$this->argument('frame'))
					->where('index',$this->argument('index'))
					->firstOrFail();

			} catch (ModelNotFoundException $e) {
				$this->error('Page not found to replace: '.$this->argument('frame').$this->argument('index'));
				die(1);
			}

		} else {
			$o->frame = $this->argument('frame');
			$o->index = $this->argument('index');
		}

		$o->content = ($this->option('trim'))
			? substr(file_get_contents($this->argument('file')),40)
			: file_get_contents($this->argument('file'));

		$o->cost = $this->option('cost');
		$o->mode_id = $this->option('mode');
		$o->type = $this->option('type');

		$o->save();
    }
}