<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\UploadedFile;

use App\Models\Blog;
use App\Models\FileUpload;
use App\Models\ContentElement;
use App\Models\TextBlock;
use App\Models\Tag;

use Carbon\Carbon;

class BlogsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //Blog::truncate();

        $blogs = DB::connection('www_brentwood')->select(
            "
                SELECT * 
                FROM tt_news
            "
        );

        $blogs = collect($blogs)->sortBy('datetime');

        if (Blog::all()->count()) {
            $old_blogs = Blog::whereHas('versions', function ($query) {
                $query->whereNotNull('published_at');
            })->get();

            if ($old_blogs->count()) {
                $last_blog = $old_blogs->last();

                $blogs = $blogs->filter(function ($blog) use ($last_blog) {
                    return Carbon::parse($blog->datetime) > $last_blog->published_at;
                });
            }
        }

        $this->command->getOutput()->progressStart($blogs->count());

        foreach ($blogs as $data) {
            $this->command->getOutput()->progressAdvance();
            //$this->command->info('UID: '.$data->uid);

            $sort_order = 3; // we reserve sort order 1 & 2 for banner and first paragraph
            $title_used = false;
            $banner = false;
            $paragraph = false;

            $data = $this->convertDataToUTF8($data);

            $input = [
                'version' => [
                    'name' => $data->title,
                    'unlisted' => $data->hidden === 1 || $data->deleted === 1 ? true : false,
                ],
                'author' => $data->author,
                'content_elements' => [],
            ];

            if (Validator::make($input, [
                'name' => 'required',
            ])->valid()) {
                //$this->command->info('CREATED: '.$data->title);

                $blog_check = Blog::whereHas('versions', function ($query) use ($data) {
                    $query->where('name', $data->title);
                })
                    ->whereHas('contentElements', function ($query) use ($data) {
                        $query->whereHasMorph('content', [TextBlock::class], function ($query) use ($data) {
                            $query->where('body', $data->bodytext);
                        });
                    })
                    ->first();

                if ($blog_check) {
                    if (!$blog_check->published_at) {
                        $blog_check->contentElements->each->contentables->each->delete();
                        $blog_check->contentElements->each->delete();
                        $blog_check->delete();
                        $blog_check = null;
                    }
                }

                if (!$blog_check) {
                    $name_count = Blog::whereHas('versions', function ($query) use ($data) {
                        $query->where('name', $data->title);
                    })->count();

                    if ($name_count) {
                        $input['version']['name'] = $data->title.' '.$name_count;
                    }

                    $blog = (new Blog())->saveBlog($input, null);

                    if ($data->image) {
                        $images = collect();
                        if (Str::contains($data->image, ',')) {
                            $data_images = collect(explode(',', $data->image));
                        } else {
                            $data_images = collect($data->image);
                        }

                        foreach ($data_images as $data_index => $data_image) {
                            $url = 'https://www.brentwood.bc.ca/uploads/pics/'.$data_image;
                            $images->push($url);
                        }

                        $this->createPhotoBlock($blog, $images, $banner ? $sort_order : 1, $banner);

                        if ($banner) {
                            $sort_order++;
                        } else {
                            $banner = true;
                        }
                    }

                    if ($data->bodytext) {
                        if ($data->title) {
                            $title_used = true;
                        }

                        $this->createTextBlock($blog, $data->bodytext, $paragraph ? $sort_order : 2, null);

                        if ($paragraph) {
                            $sort_order++;
                        } else {
                            $paragraph = true;
                        }
                    }

                    if ($data->tx_rgnewsce_ce) {
                        //$this->command->info('EXTENDED: '.$data->tx_rgnewsce_ce);
                        foreach (explode(',', $data->tx_rgnewsce_ce) as $tt_content_uid) {
                            $tt_content_images = collect(DB::connection('www_brentwood')->select(
                                "SELECT * FROM sys_file_reference
                            WHERE uid_foreign = ".$tt_content_uid."
                            AND fieldname = 'image'"
                            ));

                            if ($tt_content_images->count()) {
                                $images = collect();
                                foreach ($tt_content_images as $tt_image) {
                                    $image = collect(DB::connection('www_brentwood')->select(
                                        "SELECT * FROM sys_file WHERE uid = ".$tt_image->uid_local
                                    ))->first();

                                    $image = $this->convertDataToUTF8($image);

                                    $url = 'https://www.brentwood.bc.ca/fileadmin'.$image->identifier;
                                    $images->push($url);
                                }

                                $this->createPhotoBlock($blog, $images, $banner ? $sort_order : 1, $banner);

                                if ($banner) {
                                    $sort_order++;
                                } else {
                                    $banner = true;
                                }
                            }

                            $tt_content = collect(DB::connection('www_brentwood')->select(
                                "SELECT * 
                             FROM tt_content
                             WHERE uid = ".$tt_content_uid
                            ))->first();

                            $tt_content = $this->convertDataToUTF8($tt_content);

                            if ($tt_content) {
                                $this->createTextBlock($blog, $tt_content->bodytext, $paragraph ? $sort_order : 2, $title_used ? $tt_content->header : null);
                                $title_used = true;
                                if ($paragraph) {
                                    $sort_order++;
                                } else {
                                    $paragraph = true;
                                }
                            } else {
                                //$this->command->error('NOT FOUND EXTENDED TT_CONTENT: '.$tt_content_uid);
                            }
                        }
                    }


                    $tags_data = collect(DB::connection('www_brentwood')->select(
                        "SELECT *
                    FROM tt_news_cat_mm
                    WHERE uid_local = ".$data->uid
                    ));

                    if ($tags_data->count()) {
                        $tags = $tags_data->map(function ($tag_data) {
                            return collect(DB::connection('www_brentwood')->select(
                                "SELECT *
                            FROM tt_news_cat
                            WHERE uid = ".$tag_data->uid_foreign
                            ))->first();
                        })
                        ->filter()
                        ->pluck('title')
                        ->map(function ($title) {
                            return str_replace(
                                ['Campus Life', 'Business & IT', 'University Counselling'],
                                ['Student Life', 'Business', 'Post Secondary Counselling'],
                                $title,
                            );
                        })
                        ->map(function ($title) {
                            return Tag::where('name', $title)->first();
                        })
                        ->filter();

                        foreach ($tags as $tag) {
                            $blog->addTag($tag);
                        }
                    }

                    $blog->publish();
                    $blog->refresh();
                    $version = $blog->publishedVersion;
                    $version->published_at = Carbon::parse($data->datetime);
                    $version->save();
                }
            }
        }

        $this->command->getOutput()->progressFinish();
    }

    protected function createTextBlock($blog, $bodytext, $sort_order, $title = null)
    {
        $text_block = (new ContentElement())->saveContentElement([
            'type' => 'text-block',
            'content' => [
                'id' => 0,
                'header' => $title,
                'body' => $this->convertLinkTags($bodytext),
                'full_width' => 0,
            ],
            'pivot' => [
                'contentable_id' => $blog->id,
                'contentable_type' => 'blog',
                'expandable' => null,
                'sort_order' => $sort_order,
                'unlisted' => false,
                'guest' => false,
                'no_margin' => false,
                'filter' => false,
                'hide_print' => false,
            ],
        ], null);
    }

    protected function convertLinkTags($bodytext)
    {
        $text = strip_tags($bodytext, '<p><a><link><br>');

        preg_match_all('/\<link ([^ \>]*).*?\>([^\<]*)\<\/link\>/i', $text, $match);

        foreach ($match[0] as $index => $find) {
            $url = $match[1][$index];

            if (filter_var($url, FILTER_VALIDATE_EMAIL)) {
                $url = 'mailto:'.$url;
            }

            $replace = '<a href="'.$url.'">'.$match[2][$index].'</a>';

            $text = Str::replace($find, $replace, $text, caseSensitive: false);
        }

        return $text;
    }

    protected function createPhotoBlock($blog, $urls, $sort_order, $banner)
    {
        $photos = collect();

        foreach ($urls as $index => $url) {
            $info = pathinfo($url);
            $contents = file_get_contents($url);
            $file = '/tmp/' . $info['basename'];
            file_put_contents($file, $contents);

            if (is_array(getimagesize($file))) {
                $uploaded_file = new UploadedFile($file, $info['basename']);
                $file_upload = (new FileUpload())->saveFile($uploaded_file);

                $photo = [
                    'alt' => "",
                    'description' => "",
                    'file_upload' => $file_upload,
                    'file_upload_id' => $file_upload->id,
                    'fill' => true,
                    'id' => 0,
                    'large' => null,
                    'link' => null,
                    'name' => "",
                    'offsetX' => 50,
                    'offsetY' => 50,
                    'sort_order' => $index + 1,
                    'span' => $urls->count() === 1 && $banner ? 2 : 1,
                    'vertical_span' => 1,
                    'hide_print' => false,
                    'subtitle' => null,
                    'title' => null,
                    'enlarge' => false,
                    'hide_mobile' => false,
                    'border' => false,
                    'large_link' => false,
                    'hidden_at' => now(),
                ];
                $photos->push($photo);
            }
        }

        if ($urls->count() === 4) {
            // 2 x 2 grid
            $columns = 2;
        } elseif ($urls->count() >= 3) {
            $columns = 3;
        } elseif ($urls->count() === 1 && $banner) {
            $columns = 3;
        } else {
            $columns = $urls->count();
        }

        $image = (new ContentElement())->saveContentElement([
            'type' => 'photo-block',
            'content' => [
                'id' => 0,
                'body' => '',
                'columns' => $columns,
                'header' => '',
                'height' => !$banner ? 50 : ($urls->count() === 1 ? 100 : 75),
                'id' => 0,
                'padding' => 0,
                'photos' => $photos,
                'show_text' => $urls->count() === 1 && $banner ? true : false,
                'text_order' => 1,
                'text_span' => 1,
                'text_style' => '',
                'text_first' => true,
            ],
            'pivot' => [
                'contentable_id' => $blog->id,
                'contentable_type' => 'blog',
                'expandable' => null,
                'sort_order' => $sort_order,
                'unlisted' => false,
                'guest' => false,
                'no_margin' => false,
                'filter' => false,
                'hide_print' => false,
            ],
        ], null);
    }

    protected function convertDataToUTF8($data)
    {
        $codes = [
            '&#131;' => 'ƒ',
            '&#133;' => '…',
            '&#145;' => '‘',
            '&#146;' => '’',
            '&#147;' => '“',
            '&#148;' => '”',
            '&#149;' => '•',
            '&#150;' => '–',
            '&#151;' => '—',
        ];

        foreach ($data as $property => $value) {
            if (is_string($value)) {
                $string = mb_convert_encoding($value, 'HTML-ENTITIES', 'ISO-8859-1');
                foreach ($codes as $find => $replace) {
                    $string = Str::replace($find, $replace, $string);
                }
                if (Str::contains($string, ' &#')) {
                    $this->command->info('ENTITY IN BLOG UID: '.$data->uid);
                }
                $data->$property = $string;
            }
        }
        return $data;
    }

    /*
    public function convert_from_latin1_to_utf8_recursively($dat)
    {
        if (is_string($dat)) {
            return utf8_encode($dat);
        } elseif (is_array($dat)) {
            $ret = [];
            foreach ($dat as $i => $d) {
                $ret[ $i ] = $this->convert_from_latin1_to_utf8_recursively($d);
            }

            return $ret;
        } elseif (is_object($dat)) {
            foreach ($dat as $i => $d) {
                $dat->$i = $this->convert_from_latin1_to_utf8_recursively($d);
            }

            return $dat;
        } else {
            return $dat;
        }
    }
     */
}
