<?php

namespace App\Http\Controllers\Webprofile\Backend;

use Alert;
use App\Http\Controllers\Controller;
use App\Models\Webprofile\Menu;
use App\Models\Webprofile\Pages;
use App\Repositories\Webprofile\De\MenuRepository as DeMenuRepository;
use App\Repositories\Webprofile\En\MenuRepository;
use App\Repositories\Webprofile\MenuRepository as WebprofileMenuRepository;
use App\Repositories\Webprofile\Sa\MenuRepository as SaMenuRepository;
use App\Repositories\Webprofile\Zh\MenuRepository as ZhMenuRepository;
use Auth;
use Crypt;
use Illuminate\Http\Request;
use Statickidz\GoogleTranslate;
use Validator;

class MenuController extends Controller
{
    private $SOURCE = 'id';
    private $TARGET = 'en';
    private $TARGETDE = 'de';
    private $TARGETSA = 'ar';
    private $TARGETZH = 'zh';

    public function __construct(
        MenuRepository $repoEn,
        WebprofileMenuRepository $repo,
        DeMenuRepository $repoDe,
        SaMenuRepository $repoSa,
        ZhMenuRepository $repoZh
    ) {
        $this->repoEn = $repoEn;
        $this->repoDe = $repoDe;
        $this->repoSa = $repoSa;
        $this->repoZh = $repoZh;
        $this->repo = $repo;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $parent = Menu::where('status', '1')->whereNull('url')->whereIn('level', [1, 2, 3])->pluck('name', 'id');
        $page = Pages::orderBy('title', 'asc')->pluck('title', 'id');
        $data = Menu::with(['rEn', 'rDe', 'rSa', 'rZh'])->select('id', 'parent', 'name', 'url', 'level', 'urutan')->orderby('level', 'asc')->orderby('urutan', 'asc')->get();

        $arr = $this->build_menu();

        return view('webprofile.backend.menu.index', compact('parent', 'page', 'data', 'arr'))->withTitle('Menu');
    }

    public function build_menu()
    {
        $data = Menu::select('id', 'parent', 'name', 'url', 'level', 'urutan')->where('level', '1')->orderby('urutan', 'asc')->with('rEn', 'rChild')->get()->toArray();

        return $data;
    }

    public function menu_has_child($parentid)
    {
        $data = Menu::where('parent', $parentid)->count();

        if ($data > 0) {
            return true;
        } else {
            return false;
        }
    }

    public function menu_get_child($parentid)
    {
        $cdata = Menu::select('id', 'parent', 'name', 'url', 'level', 'urutan')->where('parent', $parentid)->orderby('urutan', 'asc')->get();

        $i = 0;
        $cmenu = [];
        foreach ($cdata as $citem) {
            $cmenu[$i]['id'] = $citem->id;
            $cmenu[$i]['parent'] = $citem->parent;
            $cmenu[$i]['name'] = $citem->name;
            $cmenu[$i]['url'] = $citem->url;
            $cmenu[$i]['level'] = $citem->level;
            $cmenu[$i]['urutan'] = $citem->urutan;
            if ($this->menu_has_child($citem->parent)) {
                $cmenu[$i]['child'] = $this->menu_get_child($citem->id);
            }
            ++$i;
        }

        return $cmenu;
    }

    public function menu_up($id, $urut = 1)
    {
        $cur_menu = Menu::where('id', Crypt::decrypt($id))->first();
        if ($cur_menu->parentlevel == null) {
            $up_menu = Menu::where('level', $cur_menu->level)->where('urutan', (int) $cur_menu->urutan - $urut)->first();
        }
        if ($cur_menu->parentlevel != null) {
            $up_menu = Menu::where('parent', $cur_menu->parent)->where('level', $cur_menu->level)->where('urutan', (int) $cur_menu->urutan - $urut)->first();
        }

        if ($up_menu) {
            Menu::where('id', Crypt::decrypt($id))->update([
                'urutan' => $up_menu->urutan,
                'userid_created' => Auth::user()->name,
                'updated_at' => date('Y-m-d H:i:s'),
            ]);

            Menu::where('id', $up_menu->id)->update([
                'urutan' => $up_menu->urutan + 1,
                'userid_created' => Auth::user()->name,
                'updated_at' => date('Y-m-d H:i:s'),
            ]);

            return redirect()->route('menu.index');
        }

        return $this->menu_up($id, $urut + 1);
    }

    public function menu_down($id, $urut = 1)
    {
        $cur_menu = Menu::where('id', Crypt::decrypt($id))->first();
        if ($cur_menu->parentlevel == null) {
            $up_menu = Menu::where('level', $cur_menu->level)->where('urutan', (int) $cur_menu->urutan + $urut)->first();
        }
        if ($cur_menu->parentlevel != null) {
            $up_menu = Menu::where('parent', $cur_menu->parent)->where('level', $cur_menu->level)->where('urutan', (int) $cur_menu->urutan + $urut)->first();
        }

        if ($up_menu) {
            Menu::where('id', Crypt::decrypt($id))->update([
                'urutan' => $up_menu->urutan,
                'userid_created' => Auth::user()->name,
                'updated_at' => date('Y-m-d H:i:s'),
            ]);

            Menu::where('id', $up_menu->id)->update([
                'urutan' => $up_menu->urutan - 1,
                'userid_created' => Auth::user()->name,
                'updated_at' => date('Y-m-d H:i:s'),
            ]);

            return redirect()->route('menu.index');
        }

        return $this->menu_down($id, $urut + 1);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $data = $request->except('_token');
        $validator = Validator::make($data, Menu::$rules, Menu::$errormessage);

        if ($validator->fails()) {
            $errormessage = $validator->messages();

            return redirect()->route('menu.index')
            ->withErrors($validator)
            ->withInput();
        } else {
            if ($request->input('parent') == null || $request->input('parent') == '') {
                $parentlevel = null;
                $level = 1;
            } else {
                $getlevelparent = Menu::where('id', $request->input('parent'))->first()->level;
                $parentlevel = $getlevelparent;
                $level = (int) $getlevelparent + 1;
            }

            $urutan = Menu::where('level', $level)->where('parent', $request->input('parent'))->max('urutan');

            $data['status'] = 1;
            $data['level'] = $level;
            $data['parentlevel'] = $parentlevel;
            $data['urutan'] = $urutan + 1;
            $data['userid_created'] = Auth::user()->name;
            $data['userid_updated'] = Auth::user()->name;

            $save = Menu::create($data);

            $this->createEn($data, $save);
            $this->createDe($data, $save);
            $this->createSa($data, $save);
            $this->createZh($data, $save);

            Alert::success('Data berhasil disimpan')->persistent('Ok');

            $successmessage = 'Proses Tambah Menu Berhasil !!';

            return redirect()->route('menu.index')->with('successMessage', $successmessage);
        }
    }

    private function createEn($data, $menu, $translate = 1)
    {
        if ($translate == 1) {
            $trans = new GoogleTranslate();
            $name = $trans->translate($this->SOURCE, $this->TARGET, $data['name']);
        } else {
            $name = $data['name'];
        }

        $dataEn['menu_id'] = $menu->id;
        $dataEn['name'] = $name;

        $this->repoEn->store($dataEn);
    }

    private function createDe($data, $menu, $translate = 1)
    {
        if ($translate == 1) {
            $trans = new GoogleTranslate();
            $name = $trans->translate($this->SOURCE, $this->TARGETDE, $data['name']);
        } else {
            $name = $data['name'];
        }

        $dataDe['menu_id'] = $menu->id;
        $dataDe['name'] = $name;

        $this->repoDe->store($dataDe);
    }

    private function createSa($data, $menu, $translate = 1)
    {
        if ($translate == 1) {
            $trans = new GoogleTranslate();
            $name = $trans->translate($this->SOURCE, $this->TARGETSA, $data['name']);
        } else {
            $name = $data['name'];
        }

        $dataSa['menu_id'] = $menu->id;
        $dataSa['name'] = $name;

        $this->repoSa->store($dataSa);
    }

    private function createZh($data, $menu, $translate = 1)
    {
        if ($translate == 1) {
            $trans = new GoogleTranslate();
            $name = $trans->translate($this->SOURCE, $this->TARGETZH, $data['name']);
        } else {
            $name = $data['name'];
        }

        $dataZh['menu_id'] = $menu->id;
        $dataZh['name'] = $name;

        $this->repoZh->store($dataZh);
    }

    public function storepage(Request $request)
    {
        $data = $request->except('_token');
        $validator = Validator::make($data, Menu::$rules, Menu::$errormessage);

        if ($validator->fails()) {
            $errormessage = $validator->messages();

            return redirect()->route('menu.index')
            ->withErrors($validator)
            ->withInput();
        } else {
            if ($request->input('parentpage') == null || $request->input('parentpage') == '') {
                $parentlevel = null;
                $level = 1;
            } else {
                $getlevelparent = Menu::where('id', $request->input('parentpage'))->first()->level;
                $parentlevel = $getlevelparent;
                $level = (int) $getlevelparent + 1;
            }

            $urutan = Menu::where('level', $level)->where('parent', $request->input('parentpage'))->max('urutan');

            $page = Pages::with(['rEn'])->where('id', $request->input('page'))->first();

            $data['name'] = $page->title;
            $data['level'] = $level;
            $data['parentlevel'] = $parentlevel;
            $data['urutan'] = $urutan + 1;
            $data['parent'] = $request->input('parentpage');
            $data['url'] = '/page/'.$page->slug;
            $data['status'] = 1;
            $data['userid_created'] = Auth::user()->name;
            $data['userid_updated'] = Auth::user()->name;

            $save = Menu::create($data);

            $data['name'] = $page->rEn ? $page->rEn->title : null;
            $this->createEn($data, $save, 'notTranslate');

            $data['name'] = $page->rDe ? $page->rDe->title : null;
            $this->createDe($data, $save, 'notTranslate');

            $data['name'] = $page->rSa ? $page->rSa->title : null;
            $this->createSa($data, $save, 'notTranslate');

            $data['name'] = $page->rZh ? $page->rZh->title : null;
            $this->createZh($data, $save, 'notTranslate');

            Alert::success('Data berhasil disimpan')->persistent('Ok');

            $successmessage = 'Proses Tambah Menu Berhasil !!';

            return redirect()->route('menu.index')->with('successMessage', $successmessage);
        }
    }

    /**
     * Display the specified resource.
     *
     * @param \App\Models\Menu $menu
     *
     * @return \Illuminate\Http\Response
     */
    public function show(Menu $menu)
    {
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $id = Crypt::decrypt($id);
        $setting = webprofilesetting();
        $data = $this->repo->findId($id, ['rEn', 'rDe', 'rSa', 'rZh']);

        $data = [
            'data' => $data,
            'setting' => $setting,
        ];

        return view('webprofile.backend.menu.edit', $data)->withTitle(trans('feature.edit_menu'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $data = $request->except(['_token', 'id']);

        $data['name'] = $data['titleiid'];
        $menu = $this->repo->findId($id, ['rEn', 'rDe', 'rSa', 'rZh']);
        $this->repo->update($data, $menu);

        if ($menu->rEn) {
            $dataEn['name'] = $data['titleien'];
            $menuEn = $this->repoEn->findId($menu->rEn->id);
            $this->repoEn->update($dataEn, $menuEn);
        } else {
            $dataEn['menu_id'] = $menu->id;
            $dataEn['name'] = $data['titleien'];

            $this->repoEn->store($dataEn);
        }

        if ($menu->rDe) {
            $dataDe['name'] = $data['titleide'];
            $menuDe = $this->repoDe->findId($menu->rDe->id);
            $this->repoDe->update($dataDe, $menuDe);
        } else {
            $dataDe['menu_id'] = $menu->id;
            $dataDe['name'] = $data['titleide'];

            $this->repoDe->store($dataDe);
        }

        if ($menu->rSa) {
            $dataSa['name'] = $data['titleisa'];
            $menuSa = $this->repoSa->findId($menu->rSa->id);
            $this->repoSa->update($dataSa, $menuSa);
        } else {
            $dataSa['menu_id'] = $menu->id;
            $dataSa['name'] = $data['titleisa'];

            $this->repoSa->store($dataSa);
        }

        if ($menu->rZh) {
            $dataZh['name'] = $data['titleizh'];
            $menuZh = $this->repoZh->findId($menu->rZh->id);
            $this->repoZh->update($dataZh, $menuZh);
        } else {
            $dataZh['menu_id'] = $menu->id;
            $dataZh['name'] = $data['titleizh'];

            $this->repoZh->store($dataZh);
        }

        return redirect()->route('menu.index');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        try {
            $ceklevel = Menu::where('id', Crypt::decrypt($id))->first();
            $level = $ceklevel->level;

            Menu::where('id', Crypt::decrypt($id))->delete(Crypt::decrypt($id));
            $tataurut = Menu::where('level', $level)->orderBy('urutan', 'asc')->get();
            $urut = 1;

            foreach ($tataurut as $value) {
                Menu::where('id', $value->id)->update([
                    'urutan' => $urut++,
                    'userid_created' => Auth::user()->name,
                    'updated_at' => date('Y-m-d H:i:s'),
                ]);
            }

            return redirect()->route('menu.index');
        } catch (\Exception $id) {
            return redirect()->route('menu.index');
        }
    }
}