<?php

use App\Events\SaveDataEvent;
use Illuminate\Database\Seeder;
use App\Media;
use App\Seo;
use App\Fortuneteller;
use App\SliderDetail;

class ResetMedia extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $ignores = ['no-image.png', 'blank.png', 'logo-qole.png', 'logo-qole.webp', 'map3.png', 'map3.webp', 'map3_48x48.png', 'map3_48x48.webp', 'top_bg.jpg'];
        $uploadPath = public_path('uploads/');
        $filePath = public_path('uploads/files/');

        //Reset Media Files
        Media::truncate();
        $files = glob($filePath . "*");
        foreach ($files as $file) {
            $onlyName = str_replace($filePath, "", $file);
            if (!in_array($onlyName, $ignores)) {
                unlink($file);
                print "Deleted file: " . $onlyName . "\r\n";
            }
        }

        $checkNoImg = Media::where('file', 'no-image.png')->count();
        if ($checkNoImg <= 0) {
            Media::create([
                'name'       => 'no-image.png',
                'slug'       => 'no-image-png',
                'file'       => 'no-image.png',
                'file_type'  => 'image/png',
                'extension'  => '.png',
                'size'       => '5.5kB',
                'width'      => 260,
                'height'     => 260,
                'important'  => 0,
                'type'       => 1,
                'parent_id'  => 0,
                'is_deleted' => 0,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
            ]);
        }

        $checkBlank = Media::where('file', 'blank.png')->count();
        if ($checkBlank <= 0) {
            Media::create([
                'name'       => 'blank.png',
                'slug'       => 'blank-png',
                'file'       => 'blank.png',
                'file_type'  => 'image/png',
                'extension'  => '.png',
                'size'       => '455B',
                'width'      => 250,
                'height'     => 250,
                'important'  => 0,
                'type'       => 1,
                'parent_id'  => 0,
                'is_deleted' => 0,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
            ]);
        }

        //Add Fortune Teller Image
        $media = Media::where('name', 'Fortune Tellers')
            ->where('slug', 'fortune-tellers')
            ->where('type', 0)
            ->where('parent_id', 0)
            ->where('is_deleted', false)
            ->first();

        if (!isset($media) || $media->id == null) {
            $media = Media::create([
                'name'       => 'Fortune Tellers',
                'slug'       => 'fortune-tellers',
                'file'       => md5('Fortune Tellers' . rand(1000, 100000)),
                'type'       => 0,
                'parent_id'  => 0,
                'is_deleted' => 0,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ]);
        }

        $fortuneTellers = Fortuneteller::where('is_deleted', false)->get();
        $avatarPath = $uploadPath . "image/fortune/";
        foreach ($fortuneTellers as $fortuneTeller) {
            $fileName = $fortuneTeller->avatar;
            if ($fileName == null || $fileName == '') continue;
            if (file_exists($avatarPath . $fileName) && !file_exists($filePath . $fileName)) {
                try {
                    $imageCross = ImageCross::make($avatarPath . $fileName)->orientate()->save($filePath . $fileName);
                    $imgWidth = $imageCross->width();
                    $imgHeight = $imageCross->height();
                    $imgSize = $imageCross->filesize();
                    $fileType = $imageCross->mime();
                    $extension = "." . $this->fileExtension($fileName);
                    $baseName = trim($fortuneTeller->display_name) . $extension;
                    $slug = str_replace($extension, "", $fileName);
                    $slug = str_replace(" ", "", $slug);
                    $slug = str_replace(".", "", $slug);

                    $extKey = "223344";
                    $countBaseName = 0;
                    $checkName = Media::where('is_deleted', 0)->where('parent_id', $media->id)->where('name', $baseName)->count();
                    $firstBaseName = str_replace($extension . $extKey, "", $baseName . $extKey);
                    while ($checkName > 0) {
                        $countBaseName += 1;
                        $baseName = $firstBaseName . " (" . $countBaseName . ")" . $extension;
                        $checkName = Media::where('is_deleted', 0)->where('parent_id', $media->id)->where('name', $baseName)->count();
                    }

                    Media::create([
                        'name'       => $baseName,
                        'slug'       => $slug,
                        'file'       => $fileName,
                        'file_type'  => $fileType,
                        'extension'  => $extension,
                        'size'       => $this->formatBytes($imgSize),
                        'width'      => $imgWidth,
                        'height'     => $imgHeight,
                        'type'       => 1,
                        'parent_id'  => $media->id,
                        'is_deleted' => 0,
                        'created_at' => date('Y-m-d H:i:s'),
                        'updated_at' => date('Y-m-d H:i:s')
                    ]);
                    print "Generate Thumb: " . $fortuneTeller->id . " --- " . $fileName . "\r\n";
                } catch (NotReadableException $exception) {
                    logger("[Error] Image Cross: " . $exception->getMessage());
                } catch (\Exception $exception) {
                    logger("[Error] Image Cross: " . $exception->getMessage());
                }

            }
        }

        //Change Image of SEO
        $allSeo = Seo::all();
        foreach ($allSeo as $item) {
            $imageName = $item->image;
            if ($imageName != null && $imageName != '') {
                $item->update(['image' => basename($imageName)]);
            }
        }


        //Add Sliders Image
        $mediaSlider = Media::where('name', 'Sliders')
            ->where('slug', 'sliders')
            ->where('type', 0)
            ->where('parent_id', 0)
            ->where('is_deleted', false)
            ->first();

        if (!isset($mediaSlider) || $mediaSlider->id == null) {
            $mediaSlider = Media::create([
                'name'       => 'Sliders',
                'slug'       => 'sliders',
                'file'       => md5('Sliders' . rand(1000, 100000)),
                'type'       => 0,
                'parent_id'  => 0,
                'is_deleted' => 0,
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s')
            ]);
        }

        $listSliderDetail = SliderDetail::all();
        $sliderPath = public_path('uploads/image/slider/');
        //Media::where('parent_id', $mediaSlider->id)->delete();
        foreach ($listSliderDetail as $slider) {
            if (!file_exists($sliderPath .  $slider->image)) continue;
            $title = ($slider->title != null && $slider->title != "") ? $slider->title : $slider->image;
            $this->saveMedia($slider->image, $title, $sliderPath, $filePath, $mediaSlider->id);
        }

        $this->call(MediaThumb::class);
        $this->call(DrawThumb::class);
        event(new SaveDataEvent());
    }

    private function fileExtension($s)
    {
        $n = strrpos($s, ".");
        return ($n === false) ? "" : substr($s, $n + 1);
    }

    private function formatBytes($bytes, $precision = 2)
    {
        $units = array('B', 'Kb', 'MB', 'GB', 'TB');
        $bytes = max($bytes, 0);
        $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
        $pow = min($pow, count($units) - 1);
        $bytes /= pow(1024, $pow); //$bytes /= (1 << (10 * $pow));

        return round($bytes, $precision) . '' . $units[$pow];
    }

    private function saveMedia($fileName, $title, $oldPath, $newPath, $mediaParentId) {
        $imageCross = ImageCross::make($oldPath .  $fileName)->orientate()->save($newPath . $fileName);
        $imgWidth = $imageCross->width();
        $imgHeight = $imageCross->height();
        $imgSize = $imageCross->filesize();
        $fileType = $imageCross->mime();
        $extension = "." . $this->fileExtension($fileName);

        $baseName = trim($title);
        $baseName = str_replace($extension, "", $baseName);
        $baseName = $baseName . $extension;

        $slug = str_replace($extension, "", $fileName);
        $slug = str_replace(" ", "", $slug);
        $slug = str_replace(".", "", $slug);

        $extKey = "223344";
        $countBaseName = 0;
        $checkName = Media::where('is_deleted', 0)->where('parent_id', $mediaParentId)->where('name', $baseName)->count();
        $firstBaseName = str_replace($extension . $extKey, "", $baseName . $extKey);
        while ($checkName > 0) {
            $countBaseName += 1;
            $baseName = $firstBaseName . " (" . $countBaseName . ")" . $extension;
            $checkName = Media::where('is_deleted', 0)->where('parent_id', $mediaParentId)->where('name', $baseName)->count();
        }

        Media::create([
            'name'       => $baseName,
            'slug'       => $slug,
            'file'       => $fileName,
            'file_type'  => $fileType,
            'extension'  => $extension,
            'size'       => $this->formatBytes($imgSize),
            'width'      => $imgWidth,
            'height'     => $imgHeight,
            'type'       => 1,
            'parent_id'  => $mediaParentId,
            'is_deleted' => 0,
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ]);

        print "Media Saved: " . $baseName . "\r\n";
    }
}
