<?php

namespace App\Http\Controllers;

use App\iSession;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Yajny\Controller\SearchCtrl;
use Yajny\EventsYj\Events\ContactNew;
use Yajny\Member\Models\Member;
use Yajny\Models\Brand;
use Yajny\Models\Category;
use Yajny\Models\CategoryCoupon;
use Yajny\Models\ContactUs;
use Yajny\Models\FaqCategories;
use Yajny\Models\Faqs;
use Yajny\Models\Page;
use Yajny\Models\Tag;


class CommonController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    //

    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Category[]
     */
    public function getStoreCategories()
    {

        return Category::with(['children' => function ($q) {
            $q->selectRaw(Category::colSelect());
        }])->where('parent_id', NULL)->selectRaw(Category::colSelect())->get();
    }

    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|Tag[]
     */
    public function getTags()
    {
        return Tag::with(['children' => function ($q) {
            $q->selectRaw(Tag::colSelect());
        }])->where('parent_id', NULL)->selectRaw(Tag::colSelect())->get();
    }

    /**
     * @return array
     */
    public function getCouponCategories()
    {
        return ['CategoryCoupon' => CategoryCoupon::with(['children' => function ($q) {
            $q->selectRaw(CategoryCoupon::colSelect());
        }])->where('parent_id', NULL)->selectRaw(CategoryCoupon::colSelect())->get(), 'app_home_coupon_cats' => config('settingConfig.app_home_coupon_cats')];
    }

    /**
     * @return mixed
     */
    public function getBrands()
    {
        return Brand::selectRaw(Brand::colSelect())->get();
    }

    /**
     * @param $tag_id
     * @return mixed
     */
    public function getTagInfo($tag_id)
    {
        return Tag::selectRaw(Tag::apiColSelect())->where('id', $tag_id)->first();
    }

    /**
     * @param $brand_id
     * @return mixed
     */
    public function getBrandInfo($brand_id)
    {
        return Brand::selectRaw(Brand::apiColSelect())->where('id', $brand_id)->first();
    }

    /**
     * @param $cat_id
     * @return mixed
     */
    public function getCouponCatInfo($cat_id)
    {
        return CategoryCoupon::selectRaw(CategoryCoupon::apiColSelect())->where('id', $cat_id)->first();
    }

    /**
     * @param Request $req
     * @param $search_for
     * @return \Illuminate\Support\Collection
     */
    public function search(Request $req, $search_for)
    {
        $keyword = ($req->searchKey != '') ? $req->searchKey : '';
        return SearchCtrl::doSearch($keyword, $search_for)->groupByType();
    }

    /**
     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection|FaqCategories[]
     */
    public function help()
    {
        return FaqCategories::with(['faqs' => function ($q) {
            $q->selectRaw(Faqs::colSelect())->orderBy('sort_order', 'ASC');
        }])->selectRaw(FaqCategories::colSelect())->orderBy('sort_order', 'ASC')->get();
    }

    /**
     * @return mixed
     */
    public function terms()
    {
        return Page::where('filename', 'terms.conditions')->first();
    }

    /**
     * @param $type
     * @param $slug
     * @return int
     */
    public function findBySlug($type, $slug)
    {

        $typeToModel = [
            'tag' => 'Tag',
            'category' => 'CategoryCoupon',
            'store-category' => 'Category',
            'brand' => 'Brand',
            'store' => 'Store',
            'page' => 'Page'
        ];

        if (!isset($typeToModel[$type])) return 0;

        $clas = app('Yajny\\Models\\' . $typeToModel[$type]);
        $model = $clas->where('slug', $slug)->first();
        if ($model) return $model->id;
        else return 0;

    }

    /**
     * @param Request $req
     * @return array|string[]
     */
    public function submitContact(Request $req)
    {
        $data = $req->all();
        $unsets = ['web_token', 'token', 'appy', 'region', 'localization', 'userCurrency'];
        foreach ($unsets as $unset)
            unset($data[$unset]);
        $validations = [
            'first_name' => 'required|string',
            'last_name' => 'required|string',
            'email' => 'required|email:rfc,dns,filter|min:6',
            'reason' => 'required',
            'message' => 'required|string|min:6',
        ];
        $validatedData = Validator::make($data, $validations);
        if ($validatedData->fails()) {
            return ['errors' => $validatedData->errors()];
        }
        $contact = new ContactUs($data);
        $contact->save();
        $appLang = config('website.cnf_lang', 'ar');
        if ($req->get('lang'))
            $appLang = $req->get('lang');
        elseif ($req->get('user_id'))
            $appLang = Member::find($req->get('user_id'))->app_lang;
        elseif (isset($_POST['web_token'])) {
            $session = iSession::find($_POST['web_token']);
            $payload = unserialize(base64_decode($session->payload));
            $appLang = $payload['lang'] ?? $appLang;
        }
        event(new ContactNew($contact, $appLang));

        return ['email' => 'sent'];
    }
}
