 <?php

use Illuminate\Database\Seeder;
use App\Models\Firmware;
use App\Models\FirmwareLanguage;
use App\Models\SimpleLink;
use App\Models\SimpleLinkLanguage;
use App\Models\WebLink;
use App\Models\WebLinkLanguage;
use App\Models\ProductGroup;
use App\Models\ProductGroupLanguage;
use App\Models\SimpleRow;
use App\Models\SimpleRowLanguage;

class FirmwaresTableSeeder extends BaseSeeder
{
    private $amountToCreate = 10;
    
    public function __construct()
    {
        $this->availableLanguages = getAvailableLanguages();
    }

    public function run()
    {
        DB::beginTransaction();
        try {
            $this->call([SimpleLinksTableSeeder::class]);
            $this->call([WebLinksTableSeeder::class]);
            factory(Firmware::class, $this->amountToCreate)
                ->create()
                ->each(function ($firmware) {
                    $this->command->info("=== Starting Firmwares Seeder ===");
                    // Get all multilangue objects
                    $availableLanguages = $this->availableLanguages;

                    // Create Website Objects
                    $websiteObject = $this->createWebsiteObject($firmware, 'firmware');

                    $firmware->websites()
                        ->save($websiteObject);

                    //! --- Custom Code ---
                    $simpleLinks = [];
                    for($i = 0; $i < 2; $i++) {
                        $simpleLinks = SimpleLink::inRandomOrder()->take(2)->get()->pluck('id');
                    }
                    $firmware->references()->sync($simpleLinks);
                    $implodedSimpleLinks = implode(', ', $simpleLinks->toArray());
                    $this->command->info("Added Simple Links(". $implodedSimpleLinks . ") to this Firmware");

                    $links = [];
                    for($i = 0; $i < 2; $i++) {
                        $links = WebLink::inRandomOrder()->take(2)->get()->pluck('id');
                    }
                    $firmware->links()->sync($links);
                    $implodedLinks = implode(', ', $links->toArray());
                    $this->command->info("Added Web Links(" . $implodedLinks . ") to this Firmware");

                    $models = [];
                    for($i = 0; $i < 2; $i++) {
                        $models = ProductGroup::inRandomOrder()->take(2)->get()->pluck('id');
                    }
                    $firmware->models()->sync($models);
                    $implodedModels = implode(', ', $models->toArray());
                    $this->command->info("Added Models(" . $implodedModels . ") to this Firmware");

                    $rows = [];
                    for($i = 0; $i < 2; $i++) {
                        $rows = SimpleRow::inRandomOrder()->take(2)->get()->pluck('id');
                    }
                    $firmware->rows()->sync($rows);
                    $implodedRows = implode(', ', $rows->toArray());
                    $this->command->info("Added Rows(" . $implodedRows . ") to this Firmware");
                    //! --- End of Custom Code ---

                    // Create language relationships
                    foreach ($availableLanguages as $langCode => $lang) {
                        $firmware->languages()
                            ->save(
                                factory(FirmwareLanguage::class)->make([
                                    'language_id' => $langCode,
                                    'firmware_id' => $firmware->id
                                ])
                            );

                        // Create Website Object Language
                        $this->createWebsiteObjectLanguage($websiteObject, $langCode);
                    }

                    $this->updateUri($websiteObject, 'firmware');

                    // Save all changes
                    $firmware->save();
                    $this->command->info("Firmware created with ID: " . ' ' . $firmware->id);
                });
            DB::commit();
        } catch(Throwable $exception) {
            DB::rollback();
            throw($exception);
        }
    }
}
