<?php

use App\Models\Store;
use App\Models\StoreLanguage;

class StoreTableSeeder extends BaseSeeder
{

    private $availableLanguages = [];

    private $amountOfStores = 5;
    /**
     * Run the database seeds.
     *
     * @return void
     */

    public function __construct()
    {
        $this->availableLanguages = getAvailableLanguages();
    }

    public function run()
    {
        $this->command->info("Let's get this party started! Starting Store Seeders..");
        DB::beginTransaction();
        try {
            factory(Store::class, $this->amountOfStores)
                ->create()
                ->each(function ($store) {
                    $this->command->info("=== Starting Store Seeder ===");
                    // Get all multilangue objects
                    $availableLanguages = $this->availableLanguages;

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

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

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

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

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

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

    }

    private function _createBlock($type) {
        $availableLanguages = $this->availableLanguages;
        $block = factory(Block::class)->create([
            "type" => $type
        ]);

        $websiteObject = $this->createWebsiteObject($block, 'blocks');

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

        foreach ($availableLanguages as $langCode => $lang) {

            $block->languages()
                ->save(
                    factory(BlockLanguage::class)->state($type)->make([
                        'language_id' => $langCode,
                        'block_id' => $block->id
                    ])
                );

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

        $block->save();

        return $block->id;

    }
}
