<?php

namespace App\Console\Commands;

use App\Material;
use App\MaterialCategory;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Symfony\Component\DomCrawler\Crawler;

class ImportData extends Command
{
	/**
	 * The name and signature of the console command.
	 *
	 * @var string
	 */
	protected $signature = 'import:data';
	protected $description = 'Import material data from JSON files';
	
	/**
	 * Create a new command instance.
	 *
	 * @return void
	 */
	public function __construct()
	{
		parent::__construct();
	}
	
	/**
	 * Execute the console command.
	 *
	 * @return int
	 */
	public function handle()
	{
		//Reset Data
		MaterialCategory::where('id', '>', '0')->delete();
		
		$inputDirectory = public_path('pages/json');
		if (!File::exists($inputDirectory)) {
			$this->error("Directory {$inputDirectory} does not exist.");
			return 0;
		}
		
		$files = File::files($inputDirectory);
		foreach ($files as $file) {
			if ($file->getExtension() === 'json') {
				$jsonFilePath = $file->getPathname();
				
				try {
					$jsonContent = File::get($jsonFilePath);
					$data = json_decode($jsonContent, true);
					
					if (!empty($data)) {
						$this->warn("\r\n\r\nReading data from {$jsonFilePath}...\r\n");
						
						$categoryLevel1 = $data['type'];
						$categoryLevel1 = explode(" ", $categoryLevel1);
						$categoryLevel1 = trim($categoryLevel1[1]);
						
						$categoryLevel2 = str_replace("@/m", "", $data['sub_type']);
						$categoryLevel2 = str_replace("@\/m", "", $categoryLevel2);
						$categoryLevel2 = trim($categoryLevel2);
						
						$header = $data['header'];
						
						$convertedList = [];
						$categoryLevel3Key = "";
						foreach ($data['rows'] as $row) {
							$item = [];
							$col2Key = "";
							foreach ($row as $key => $value) {
								if ($key == "col1" && !empty($value)) {
									$categoryLevel3Key = $value;
								}
								if ($key == "col2") {
									$col2Key = $value;
								} else if ($key != "col1" && $key != "col2") {
									if (trim($value) == "") continue;
									$item[$header[$key]] = str_replace(",", "", $value);
								}
							}
							$convertedList[$categoryLevel3Key][$col2Key] = $item;
						}
						
						foreach ($convertedList as $key => $item) {
							foreach ($item as $key2 => $item2) {
								foreach ($item2 as $key3 => $item3) {
									print_r("Rows: {$categoryLevel1} > {$categoryLevel2} > {$key} > {$key2} > {$key3} > {$item3}\n");
								}
							}
						}
						
						if (!$this->confirm('Are you sure you want to import data of "'. basename($jsonFilePath) .'"?', true)) {
							$this->error("Your data has been canceled: {$jsonFilePath}");
							continue;
						}
						
						$materialCategory1 = MaterialCategory::where('name', $categoryLevel1)->where('is_deleted', false)->first();
						if (!$materialCategory1) {
							$materialCategory1 = MaterialCategory::create([
								'name'         => $categoryLevel1,
								'slug'         => $categoryLevel1,
								'parent_id'    => 0,
								'is_activated' => 1,
								'is_deleted'   => 0,
								'created_at'   => date('Y-m-d H:i:s'),
								'updated_at'   => date('Y-m-d H:i:s'),
							]);
						}
						
						$materialCategory2 = MaterialCategory::where('name', $categoryLevel2)
							->where('is_deleted', false)
							->where('parent_id', $materialCategory1->id)
							->first();
						if (!$materialCategory2) {
							$materialCategory2 = MaterialCategory::create([
								'name'         => $categoryLevel2,
								'slug'         => $categoryLevel2,
								'parent_id'    => $materialCategory1->id,
								'is_activated' => 1,
								'is_deleted'   => 0,
								'created_at'   => date('Y-m-d H:i:s'),
								'updated_at'   => date('Y-m-d H:i:s'),
							]);
						}
						
						foreach ($convertedList as $key => $item) {
							foreach ($item as $key2 => $item2) {
								foreach ($item2 as $key3 => $item3) {
									$materialCategory3 = MaterialCategory::where('name', $key)
										->where('is_deleted', false)
										->where('parent_id', $materialCategory2->id)
										->first();
									if (!$materialCategory3) {
										$materialCategory3 = MaterialCategory::create([
											'name'         => $key,
											'slug'         => $key,
											'parent_id'    => $materialCategory2->id,
											'is_activated' => 1,
											'is_deleted'   => 0,
											'created_at'   => date('Y-m-d H:i:s'),
											'updated_at'   => date('Y-m-d H:i:s'),
										]);
									}
									
									$materialCategory4 = MaterialCategory::where('name', $key2)
										->where('is_deleted', false)
										->where('parent_id', $materialCategory3->id)
										->first();
									if (!$materialCategory4) {
										$materialCategory4 = MaterialCategory::create([
											'name'         => $key2,
											'slug'         => $key2,
											'parent_id'    => $materialCategory3->id,
											'is_activated' => 1,
											'is_deleted'   => 0,
											'created_at'   => date('Y-m-d H:i:s'),
											'updated_at'   => date('Y-m-d H:i:s'),
										]);
									}
									
									$materialCategory5 = MaterialCategory::where('name', $key3)
										->where('is_deleted', false)
										->where('parent_id', $materialCategory4->id)
										->first();
									if (!$materialCategory5) {
										$materialCategory5 = MaterialCategory::create([
											'name'         => $key3,
											'slug'         => $key3,
											'parent_id'    => $materialCategory4->id,
											'unit'         => '@/m',
											'is_activated' => 1,
											'is_deleted'   => 0,
											'created_at'   => date('Y-m-d H:i:s'),
											'updated_at'   => date('Y-m-d H:i:s'),
										]);
									}
									
									$checkMaterial = Material::where('material_category_id', $materialCategory5->id)->where('is_deleted', false)->first();
									if (!$checkMaterial) {
										Material::create([
											'material_category_id' => $materialCategory5->id,
											'price'                => $item3,
											'is_activated'         => 1,
											'is_deleted'           => 0,
											'created_at'           => date('Y-m-d H:i:s'),
											'updated_at'           => date('Y-m-d H:i:s'),
										]);
									} else {
										$checkMaterial->update([
											'price'        => $item3,
											'is_activated' => 1,
											'is_deleted'   => 0,
											'updated_at'   => date('Y-m-d H:i:s'),
										]);
									}
									
									//print_r("Rows: {$categoryLevel1} > {$categoryLevel2} > {$key} > {$key2} > {$key3} > {$item3}\n");
								}
							}
						}
						
						$this->info('[Done] Import data successfully.');
					}
				} catch (\Exception $e) {
					$this->error("Error processing file {$jsonFilePath}: {$e->getMessage()}");
				}
			}
		}
		
		$this->info('JSON data imported successfully.');
	}
}
