<?php

use App\Facades\ContentTypes;

use App\Models\GenericBackoffice\WebsiteObject;
use App\Models\GenericBackoffice\WebsiteObjectLanguage;
use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
use App\Models\MediaItem;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Str;

abstract class BaseSeeder extends Seeder
{
    public function createMediaItem()
    {
        $this->command->info("=== Starting Media Item Seeder ===");
        $faker = Faker::create();
        $file = $faker->image();

        $fileSystem = new Filesystem();

        $exists = $fileSystem->exists($file);
        if (!$exists) {
            throw new Exception("Image file does not exist - " . $file);
        }

        $filename = $fileSystem->name($file);
        $extension = $fileSystem->extension($file);
        $filenameWithExtension = $filename . '.' . $extension;
        $size = $fileSystem->size($file);

        $destinationPath = config('path.seed.media');
        $finalFilename = $this->_validateMediaFilename($filename, $extension, $destinationPath);

        $moveFile = $fileSystem->move($file, $destinationPath . '/' . $finalFilename);

        if (!$moveFile) {
            throw new Exception("Image could not be moved - " . $file . ' / ' . $destinationPath . '/' . $finalFilename);
        }

        $mediaType = $this->_getMediaType($extension);

        $mediaItem = factory(MediaItem::class)->make([
            'filename'          => $finalFilename,
            'original_filename' => $filenameWithExtension,
            'title'             => $filename,
            'extension'         => $extension,
            'media_type'        => $mediaType,
            'size'              => $size
        ]);

        $mediaItem->save();
        $this->command->info("MediaItem created with ID: " . ' ' . $mediaItem->id);
        return $mediaItem->id;
    }

    public function createWebsiteObject($objectType, $contentType, $slug = NULL)
    {
        if (is_null($slug)) {
            $websiteObject = factory(WebsiteObject::class)->make([
                'object_id'    => $objectType->id,
                'object_type'  => get_class($objectType),
                'content_type' => $contentType
            ]);
        } else {
            $websiteObject = factory(WebsiteObject::class)->make([
                'object_id'    => $objectType->id,
                'object_type'  => get_class($objectType),
                'content_type' => $contentType,
                'slug'         => Str::slug($slug, '-'),
            ]);
        }

        return $websiteObject;
    }

    public function createWebsiteObjectLanguage($websiteObject, $langCode)
    {
        return $websiteObject->languages()
            ->save(
                factory(WebsiteObjectLanguage::class)->make([
                    'website_object_id' => $websiteObject->id,
                    'wo_language_id'    => $langCode,
                    'lang_slug'         => $websiteObject->slug
                ])
            );
    }

    public function updateUri($websiteObject, $type)
    {
        $contentType = ContentTypes::find($type);
        $uri = $contentType->getBaseUri();
        $languages = getAvailableLanguages();
        $defaultLang = getDefaultLanguage();

        $defaultUri = "";
        foreach ($languages as $langCode => $lang) {
            $woLang = $websiteObject->languages->findByLocale($langCode);

            if (is_array($uri)) {
                $uriLang = $uri[$langCode];
            } else {
                $uriLang = $uri;
            }
            $woLang->lang_uri = $uriLang.'/'.$woLang->lang_slug;
            if ($defaultLang == $langCode) {
                $defaultUri = $woLang->lang_uri;
            }
            $woLang->save();
        }

        $websiteObject->uri = $defaultUri;
        $websiteObject->save();
    }

    private function _validateMediaFilename($filename, $extension, $destinationPath)
    {
        $newFilename = urlize($filename);
        $finalName = $newFilename.'.'.$extension;
        //Checks for colliding filenames
        $i = 1;
        while (Storage::has($destinationPath.'/'.$finalName)) {
            $finalName = $newFilename.'-'.$i.'.'.$extension;
            $i++;
            //for safety
            if ($i > 100) {
                throw new Exception("File already exists - ".$extension);
            }
        }

        return $finalName;
    }

    private function _getMediaType($extension)
    {
        $allowedExts = config('backoffice.media.allowedExts');
        foreach ($allowedExts as $type => $allowedExt) {
            if (in_array($extension, $allowedExt)) {
                return $type;
            }
        }
        throw new Exception("Extension of the file is not allowed - ".$extension);
    }

}
