<?php

namespace App\Http\Controllers\Admin;

use App\Area;
use App\Consultation;
use App\Fortunemethod;
use App\Fortuneteller;
use App\Http\Controllers\Controller;
use App\RefName;
use App\SeoFormat;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Seo;
use App\Http\Resources\Admin\SeoResource;
use Mockery\Generator\Method;
use Validator;

/**
 * Class SeoController
 *
 * @package App\Http\Controllers
 */
class SeoController extends Controller
{
    const ITEM_PER_PAGE = 20;

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $list = Seo::select('*');
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $status = Arr::get($searchParams, 'status', '');

        if (!empty($keyword)) {
            $list->where('uri', 'LIKE', '%' . $keyword . '%');
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('id');

        return SeoResource::collection($list->paginate($limit));
    }

    public function all()
    {
        $list = Seo::select('id', 'uri', 'title', 'keywords', 'description', 'image')->orderBy('id');

        return SeoResource::collection($list->get());
    }

    public function show($id = 0)
    {
        $seo = Seo::where('id', $id)->first();
        if (!isset($seo)) return response()->json(['errors' => 'Seo is not valid'], 403);

        return new SeoResource($seo);
    }

    public function seoFormat()
    {
        $formats = SeoFormat::all();
        return response()->json(['data' => $formats], 200);
    }

    public function seoCheck(Request $request)
    {
        $uri = $request->get('uri');
        $seo = Seo::where('uri', $uri)->first();
        $data = ['status' => 'error', 'id' => null];
        if (isset($seo) && $seo->id != null) {
            $data = ['status' => 'success', 'id' => $seo->id];
        }

        return response()->json($data, 200);
    }

    public function areaSeo(Request $request)
    {
        $validator = Validator::make($request->all(), ['title' => ['required'], 'description' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $countUpdate = 0;
        $countCreate = 0;
        $list = Area::all();
        foreach ($list as $item) {
            if ($item->slug == null || $item->slug == "") continue;
            $uri = '/area/' . $item->slug;
            $title = str_replace("%title%", $item->name, $params['title']);
            $title = str_replace("%title %", $item->name, $title);
            $title = str_replace("% title%", $item->name, $title);
            $title = str_replace("% title %", $item->name, $title);

            $description = str_replace("%title%", $item->name, $params['description']);
            $description = str_replace("% title%", $item->name, $description);
            $description = str_replace("%title %", $item->name, $description);
            $description = str_replace("% title %", $item->name, $description);

            $keywords = str_replace("%title%", $item->name, $params['keywords']);
            $keywords = str_replace("% title%", $item->name, $keywords);
            $keywords = str_replace("%title %", $item->name, $keywords);
            $keywords = str_replace("% title %", $item->name, $keywords);

            $data = [
                'uri'         => $uri,
                'title'       => $title,
                'keywords'    => $keywords,
                'description' => $description,
                'type'        => 'area',
            ];

            $checkSeo = Seo::where('uri', $uri)->first();
            if (isset($checkSeo) && $checkSeo->id != null) {
                $appendData = [];
                if ($params['override'] == true || $params['override'] == "true" || $params['override'] == 1 && $params['override'] == "1") {
                    $appendData = $data;
                } else {
                    if ($checkSeo->title == null && $checkSeo->title == "") $appendData['title'] = $data['title'];
                    if ($checkSeo->keywords == null && $checkSeo->keywords == "") $appendData['keywords'] = $data['keywords'];
                    if ($checkSeo->description == null && $checkSeo->description == "") $appendData['description'] = $data['description'];
                }
                if (count($appendData) > 0) {
                    $appendData['updated_at'] = date('Y-m-d H:i:s');
                    Seo::where('uri', $uri)->update($appendData);
                    $countUpdate++;
                }
            } else {
                $data['created_at'] = date('Y-m-d H:i:s');
                $data['updated_at'] = date('Y-m-d H:i:s');
                Seo::create($data);
                $countCreate++;
            }
        }

        SeoFormat::where('type', 'area')->update([
            'title'       => $params['title'],
            'keywords'    => $params['keywords'],
            'description' => $params['description'],
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        return response()->json(['data' => ['status' => 'success', 'created' => $countCreate, 'updated' => $countUpdate]], 200);
    }

    public function methodSeo(Request $request)
    {
        $validator = Validator::make($request->all(), ['title' => ['required'], 'description' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $countUpdate = 0;
        $countCreate = 0;
        $list = Fortunemethod::all();
        foreach ($list as $item) {
            if ($item->slug == null || $item->slug == "") continue;
            $uri = '/method/' . $item->slug;
            $title = str_replace("%title%", $item->name, $params['title']);
            $title = str_replace("%title %", $item->name, $title);
            $title = str_replace("% title%", $item->name, $title);
            $title = str_replace("% title %", $item->name, $title);

            $description = str_replace("%title%", $item->name, $params['description']);
            $description = str_replace("% title%", $item->name, $description);
            $description = str_replace("%title %", $item->name, $description);
            $description = str_replace("% title %", $item->name, $description);

            $keywords = str_replace("%title%", $item->name, $params['keywords']);
            $keywords = str_replace("% title%", $item->name, $keywords);
            $keywords = str_replace("%title %", $item->name, $keywords);
            $keywords = str_replace("% title %", $item->name, $keywords);

            $data = [
                'uri'         => $uri,
                'title'       => $title,
                'keywords'    => $keywords,
                'description' => $description,
                'type'        => 'method',
            ];

            $checkSeo = Seo::where('uri', $uri)->first();
            if (isset($checkSeo) && $checkSeo->id != null) {
                $appendData = [];
                if ($params['override'] == true || $params['override'] == "true" || $params['override'] == 1 && $params['override'] == "1") {
                    $appendData = $data;
                } else {
                    if ($checkSeo->title == null && $checkSeo->title == "") $appendData['title'] = $data['title'];
                    if ($checkSeo->keywords == null && $checkSeo->keywords == "") $appendData['keywords'] = $data['keywords'];
                    if ($checkSeo->description == null && $checkSeo->description == "") $appendData['description'] = $data['description'];
                }
                if (count($appendData) > 0) {
                    $appendData['updated_at'] = date('Y-m-d H:i:s');
                    Seo::where('uri', $uri)->update($appendData);
                    $countUpdate++;
                }
            } else {
                $data['created_at'] = date('Y-m-d H:i:s');
                $data['updated_at'] = date('Y-m-d H:i:s');
                Seo::create($data);
                $countCreate++;
            }
        }

        SeoFormat::where('type', 'method')->update([
            'title'       => $params['title'],
            'keywords'    => $params['keywords'],
            'description' => $params['description'],
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        return response()->json(['data' => ['status' => 'success', 'created' => $countCreate, 'updated' => $countUpdate]], 200);
    }

    public function consultationSeo(Request $request)
    {
        $validator = Validator::make($request->all(), ['title' => ['required'], 'description' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $countUpdate = 0;
        $countCreate = 0;
        $list = Consultation::all();
        foreach ($list as $item) {
            $uri = '/fortune-teller?consultation=' . $item->id;
            $title = str_replace("%title%", $item->name, $params['title']);
            $title = str_replace("%title %", $item->name, $title);
            $title = str_replace("% title%", $item->name, $title);
            $title = str_replace("% title %", $item->name, $title);

            $description = str_replace("%title%", $item->name, $params['description']);
            $description = str_replace("% title%", $item->name, $description);
            $description = str_replace("%title %", $item->name, $description);
            $description = str_replace("% title %", $item->name, $description);

            $keywords = str_replace("%title%", $item->name, $params['keywords']);
            $keywords = str_replace("% title%", $item->name, $keywords);
            $keywords = str_replace("%title %", $item->name, $keywords);
            $keywords = str_replace("% title %", $item->name, $keywords);

            $data = [
                'uri'         => $uri,
                'title'       => $title,
                'keywords'    => $keywords,
                'description' => $description,
                'type'        => 'custom',
            ];

            $checkSeo = Seo::where('uri', $uri)->first();
            if (isset($checkSeo) && $checkSeo->id != null) {
                $appendData = [];
                if ($params['override'] == true || $params['override'] == "true" || $params['override'] == 1 && $params['override'] == "1") {
                    $appendData = $data;
                } else {
                    if ($checkSeo->title == null && $checkSeo->title == "") $appendData['title'] = $data['title'];
                    if ($checkSeo->keywords == null && $checkSeo->keywords == "") $appendData['keywords'] = $data['keywords'];
                    if ($checkSeo->description == null && $checkSeo->description == "") $appendData['description'] = $data['description'];
                }
                if (count($appendData) > 0) {
                    $appendData['updated_at'] = date('Y-m-d H:i:s');
                    Seo::where('uri', $uri)->update($appendData);
                    $countUpdate++;
                }
            } else {
                $data['created_at'] = date('Y-m-d H:i:s');
                $data['updated_at'] = date('Y-m-d H:i:s');
                Seo::create($data);
                $countCreate++;
            }
        }

        SeoFormat::where('type', 'consultation')->update([
            'title'       => $params['title'],
            'keywords'    => $params['keywords'],
            'description' => $params['description'],
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        return response()->json(['data' => ['status' => 'success', 'created' => $countCreate, 'updated' => $countUpdate]], 200);
    }

    public function nameSeo(Request $request)
    {
        $validator = Validator::make($request->all(), ['title' => ['required'], 'description' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $countUpdate = 0;
        $countCreate = 0;
        $list = RefName::all();
        foreach ($list as $item) {
            $uri = '/fortune-teller?refName=' . $item->id;
            $title = str_replace("%title%", $item->name, $params['title']);
            $title = str_replace("%title %", $item->name, $title);
            $title = str_replace("% title%", $item->name, $title);
            $title = str_replace("% title %", $item->name, $title);

            $description = str_replace("%title%", $item->name, $params['description']);
            $description = str_replace("% title%", $item->name, $description);
            $description = str_replace("%title %", $item->name, $description);
            $description = str_replace("% title %", $item->name, $description);

            $keywords = str_replace("%title%", $item->name, $params['keywords']);
            $keywords = str_replace("% title%", $item->name, $keywords);
            $keywords = str_replace("%title %", $item->name, $keywords);
            $keywords = str_replace("% title %", $item->name, $keywords);

            $data = [
                'uri'         => $uri,
                'title'       => $title,
                'keywords'    => $keywords,
                'description' => $description,
                'type'        => 'custom',
            ];

            $checkSeo = Seo::where('uri', $uri)->first();
            if (isset($checkSeo) && $checkSeo->id != null) {
                $appendData = [];
                if ($params['override'] == true || $params['override'] == "true" || $params['override'] == 1 && $params['override'] == "1") {
                    $appendData = $data;
                } else {
                    if ($checkSeo->title == null && $checkSeo->title == "") $appendData['title'] = $data['title'];
                    if ($checkSeo->keywords == null && $checkSeo->keywords == "") $appendData['keywords'] = $data['keywords'];
                    if ($checkSeo->description == null && $checkSeo->description == "") $appendData['description'] = $data['description'];
                }
                if (count($appendData) > 0) {
                    $appendData['updated_at'] = date('Y-m-d H:i:s');
                    Seo::where('uri', $uri)->update($appendData);
                    $countUpdate++;
                }
            } else {
                $data['created_at'] = date('Y-m-d H:i:s');
                $data['updated_at'] = date('Y-m-d H:i:s');
                Seo::create($data);
                $countCreate++;
            }
        }

        SeoFormat::where('type', 'name')->update([
            'title'       => $params['title'],
            'keywords'    => $params['keywords'],
            'description' => $params['description'],
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        return response()->json(['data' => ['status' => 'success', 'created' => $countCreate, 'updated' => $countUpdate]], 200);
    }

    public function fortuneSeo(Request $request)
    {
        $validator = Validator::make($request->all(), ['title' => ['required'], 'description' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $countUpdate = 0;
        $countCreate = 0;
        $list = Fortuneteller::all();
        foreach ($list as $item) {
            if ($item->number == null || $item->number == "") continue;
            $uri = '/fortune-teller/detail/' . $item->number;
            $title = str_replace("%title%", $item->display_name, $params['title']);
            $title = str_replace("%title %", $item->display_name, $title);
            $title = str_replace("% title%", $item->display_name, $title);
            $title = str_replace("% title %", $item->display_name, $title);

            $keywords = str_replace("%title%", $item->display_name, $params['keywords']);
            $keywords = str_replace("% title%", $item->display_name, $keywords);
            $keywords = str_replace("%title %", $item->display_name, $keywords);
            $keywords = str_replace("% title %", $item->display_name, $keywords);

            $description = str_replace("%title%", $item->display_name, $params['description']);
            $description = str_replace("% title%", $item->display_name, $description);
            $description = str_replace("%title %", $item->display_name, $description);
            $description = str_replace("% title %", $item->display_name, $description);

            $item->update([
                'desc_1_title' => $title,
                'desc_1_short' => $keywords,
                'desc_1_full'  => $description,
            ]);

            $data = [
                'uri'         => $uri,
                'title'       => $title,
                'keywords'    => $keywords,
                'description' => $description,
                'type'        => 'teller',
                'post_id'     => $item->id,
            ];

            $checkSeo = Seo::where('uri', $uri)->first();
            if (isset($checkSeo) && $checkSeo->id != null) {
                $appendData = [];
                if ($params['override'] == true || $params['override'] == "true" || $params['override'] == 1 && $params['override'] == "1") {
                    $appendData = $data;
                } else {
                    if ($checkSeo->title == null && $checkSeo->title == "") $appendData['title'] = $data['title'];
                    if ($checkSeo->keywords == null && $checkSeo->keywords == "") $appendData['keywords'] = $data['keywords'];
                    if ($checkSeo->description == null && $checkSeo->description == "") $appendData['description'] = $data['description'];
                }
                if (count($appendData) > 0) {
                    $appendData['updated_at'] = date('Y-m-d H:i:s');
                    Seo::where('uri', $uri)->update($appendData);
                    $countUpdate++;
                }
            } else {
                $data['created_at'] = date('Y-m-d H:i:s');
                $data['updated_at'] = date('Y-m-d H:i:s');
                Seo::create($data);
                $countCreate++;
            }
        }

        SeoFormat::where('type', 'fortune')->update([
            'title'       => $params['title'],
            'keywords'    => $params['keywords'],
            'description' => $params['description'],
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        return response()->json(['data' => ['status' => 'success', 'created' => $countCreate, 'updated' => $countUpdate]], 200);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), ['uri' => ['required'], 'title' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();
        $uri = trim("/" . $params['uri']);
        $uri = str_replace("/ ", "/", $uri);
        $uri = str_replace(" / ", "/", $uri);
        $uri = str_replace(" /", "/", $uri);
        $uri = str_replace(" ", "-", $uri);
        $uri = str_replace("//", "/", $uri);
        $uri = str_replace("&&", "&", $uri);
        $uri = str_replace("/?", "?", $uri);
        $uri = str_replace("?/", "?", $uri);
        $uri = str_replace("??", "?", $uri);
        $uri = str_replace("?&", "?", $uri);
        if (strlen($uri) > 1 && $uri[strlen($uri) - 1] == "/") $uri = substr($uri, 0, -1);
        $seoExist = Seo::where('uri', $uri)->first();
        if (isset($seoExist)) return response()->json(['errors' => 'Uri is exist'], 403);

        if (strpos($uri, "/fortune-teller/detail/") !== false) {
            $type = "teller";
        } else if (strpos($uri, "/method/") !== false) {
            $type = "method";
        } else if (strpos($uri, "/area/") !== false) {
            $type = "area";
        } else if (strpos($uri, "/shop/") !== false) {
            $type = "shop";
        } else {
            $type = "custom";
        }

        $seo = Seo::create([
            'uri'         => $uri,
            'title'       => $params['title'],
            'keywords'    => $params['keywords'],
            'description' => $params['description'],
            'note'        => $params['note'],
            'type'        => $type,
            'created_at'  => date('Y-m-d H:i:s'),
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        if (strpos($uri, "/fortune-teller/detail/") !== false) {
            $slug = str_replace("/fortune-teller/detail/", "", $uri);
            $slug = str_replace(" ", "", $slug);
            $slug = str_replace("/", "", $slug);
            $slug = trim($slug);
            if ($slug != null && $slug !== "") {
                $fortune = Fortuneteller::where('slug', $slug)->first();
                if (isset($fortune)) {
                    $fortune->update([
                        'slug'          => $slug,
                        'desc_1_title'  => $params['title'],
                        'desc_1_short'  => $params['keywords'],
                        'desc_1_full'   => $params['description']
                    ]);
                    $seo->update(['post_id' => $fortune->id, 'type' => 'teller']);
                }
            }
        }

        return new SeoResource($seo);
    }

    public function update($id = 0, Request $request)
    {
        $validator = Validator::make($request->all(), ['uri' => ['required'], 'title' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $seo = Seo::where('id', $id)->first();
        if (!isset($seo)) return response()->json(['errors' => 'Seo is not valid'], 403);
        $params = $request->all();
        $oldUri = $seo->uri;
        $uri = trim("/" . $params['uri']);
        $uri = str_replace("/ ", "/", $uri);
        $uri = str_replace(" / ", "/", $uri);
        $uri = str_replace(" /", "/", $uri);
        $uri = str_replace(" ", "-", $uri);
        $uri = str_replace("//", "/", $uri);
        $uri = str_replace("&&", "&", $uri);
        $uri = str_replace("/?", "?", $uri);
        $uri = str_replace("?/", "?", $uri);
        $uri = str_replace("??", "?", $uri);
        $uri = str_replace("?&", "?", $uri);
        if (strlen($uri) > 1 && $uri[strlen($uri) - 1] == "/") $uri = substr($uri, 0, -1);

        $seoExist = Seo::where('id', '!=', $id)->where('uri', $uri)->first();
        if (isset($seoExist)) return response()->json(['errors' => 'Uri is exist'], 403);

        if (strpos($uri, "/fortune-teller/detail/") !== false) {
            $type = "teller";
        } else if (strpos($uri, "/method/") !== false) {
            $type = "method";
        } else if (strpos($uri, "/area/") !== false) {
            $type = "area";
        } else if (strpos($uri, "/shop/") !== false) {
            $type = "shop";
        } else {
            $type = "custom";
        }

        $seo->update([
            'uri'         => $uri,
            'title'       => $params['title'],
            'keywords'    => $params['keywords'],
            'description' => $params['description'],
            'note'        => $params['note'],
            'type'        => $type,
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

        if (strpos($uri, "/fortune-teller/detail/") !== false) {
            $slugNew = str_replace("/fortune-teller/detail/", "", $uri);
            $slugNew = str_replace(" ", "", $slugNew);
            $slugNew = str_replace("/", "", $slugNew);
            $slugNew = trim($slugNew);
            if ($slugNew != null && $slugNew !== "") {
                $fortune = Fortuneteller::where('slug', $slugNew)->first();
                if (!isset($fortune) || $fortune->id == null) {
                    $slugOld = str_replace("/fortune-teller/detail/", "", $oldUri);
                    $slugOld = str_replace(" ", "", $slugOld);
                    $slugOld = str_replace("/", "", $slugOld);
                    $slugOld = trim($slugOld);
                    $fortune = Fortuneteller::where('slug', $slugOld)->first();
                }
                if (isset($fortune)) {
                    $fortune->update([
                        'slug'          => $slugNew,
                        'desc_1_title'  => $params['title'],
                        'desc_1_short'  => $params['keywords'],
                        'desc_1_full'   => $params['description']
                    ]);
                    $seo->update(['post_id' => $fortune->id, 'type' => 'teller']);
                }
            }
        }

        return response()->json(null, 204);
    }

    public function destroy($id = 0)
    {
        $seo = Seo::where('id', $id)->where('type', 'teller')->first();
        if (!isset($seo)) response()->json(['error' => 'Ehhh! Can not delete this seo'], 403);
        try {
            $seo->delete();
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function destroyMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $seoList = Seo::whereIn('id', $listIds)->get();
        if ($seoList->count() <= 0) response()->json(['error' => 'Seo is not valid.'], 403);
        try {
            Seo::whereIn('id', $listIds)->where('type', 'teller')->delete();
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }
}
