<?php

namespace App\Observers;

use App\Http\Controllers\SettingsController;
use App\Models\Central\FrontMenu;
use App\Models\languages;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
use Yajny\EventsYj\Events\BonusNew;
use Yajny\EventsYj\Events\CashbackNew;
use Yajny\EventsYj\Events\CashbackUpdated;
use Yajny\EventsYj\Events\ClaimCommented;
use Yajny\EventsYj\Events\ClaimUpdated;
use Yajny\EventsYj\Events\SaleNew;
use Yajny\EventsYj\Events\SaleUpdated;
use Yajny\Member\Models\Currencies;
use Yajny\Member\Models\Member;
use Yajny\Member\Models\Sale;
use Yajny\Member\Models\UserBonus;
use Yajny\Member\Models\UserClaim;
use Yajny\Member\Models\UserClaimComment;
use Yajny\Member\Models\UserSales;
use Yajny\Models\Country;

class CentralObserver
{
    protected $myData;


    public function creating($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_creating')) {
            $this->myData = $myData;
            $this->{$className . '_creating'}();
        }
    }

    public function created($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_created')) {
            $this->myData = $myData;
            $this->{$className . '_created'}();
        }
    }


    public function updating($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_updating')) {
            $this->myData = $myData;
            $this->{$className . '_updating'}();
        }
    }


    public function updated($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_updated')) {
            $this->myData = $myData;
            $this->{$className . '_updated'}();
        }
    }

    public function deleting($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_deleting')) {
            $this->myData = $myData;
            $this->{$className . '_deleting'}();
        }
    }


    public function deleted($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_deleted')) {
            $this->myData = $myData;
            $this->{$className . '_deleted'}();
        }
    }

    public function saving($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_saving')) {
            $this->myData = $myData;
            $this->{$className . '_saving'}();
        }
    }

    public function saved($myData)
    {
        $className = class_basename(get_class($myData));

        if (method_exists($this, $className . '_saved')) {
            $this->myData = $myData;
            $this->{$className . '_saved'}();
        }
    }


    public function brands_creating()
    {
        $name = json_decode($this->myData->name);

        $this->myData->slug = Str::slug($name->en);
    }

    public function storecategories_creating()
    {
        $name = json_decode($this->myData->name);
        $this->myData->slug = Str::slug($name->en);
    }

    public function couponcategories_creating()
    {
        $title = json_decode($this->myData->name);

        $this->myData->slug = Str::slug($title->en);
    }

    public function faqcategories_creating()
    {
        $title = json_decode($this->myData->name);
        $this->myData->slug = Str::slug($title->en);
    }

    public function faqs_creating()
    {
        $title = json_decode($this->myData->title);
        $this->myData->slug = Str::slug($title->en);
    }

    public function pages_creating()
    {
        $title = json_decode($this->myData->title);
        $this->myData->slug = Str::slug($title->en);
    }

    public function pages_saved()
    {
        FrontMenu::where('menu_type', 'internal')->where('module', $this->myData->getOriginal('slug'))->update(['module' => $this->myData->slug]);

        return true;
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, config('website.cnf_appurl') . '/downloadPagesRoutes');
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt(
            $ch,
            CURLOPT_POSTFIELDS,
            http_build_query(array('sweet' => md5('lord'), 'mama' => md5('mia')))
        );

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        curl_exec($ch);

        curl_close($ch);

    }

    public function stores_saving()
    {

        if (strlen($this->myData->slug) < 1) {
            $name = json_decode($this->myData->name);
            $this->myData->slug = Str::slug($name->en);
        }

        if (strlen($this->myData->domain_name) < 1 && strlen($this->myData->homepage) > 1) {
            $this->myData->domain_name = $this->getDomain($this->myData->homepage);
        }

    }

    function getDomain($url)
    {
        $pieces = parse_url($url);
        $domain = isset($pieces['host']) ? $pieces['host'] : '';
        if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
            return $regs['domain'];
        }
        return FALSE;
    }


    public function tags_creating()
    {
        $name = json_decode($this->myData->name);
        $this->myData->slug = Str::slug($name->en);
    }


    public function currencies_saving()
    {

        if ($this->myData->is_primary == 1) {

            $websiteConfig = config('website');
            if ($this->myData->display_as == 'prefix') {
                $websiteConfig['cnf_currencyname'] = $this->myData->symbol;
                $websiteConfig['cnf_currencysuffix'] = '';

            } else {
                $websiteConfig['cnf_currencyname'] = '';
                $websiteConfig['cnf_currencysuffix'] = $this->myData->symbol;
            }


            $websiteConfig['cnf_system_currency'] = $this->myData->iso_code;


            $val = '<?php
            return
            ' . (var_export($websiteConfig, true)) . '
            ;
            ';

            \CentralHelpers::updateSettings($val);

            \DB::table('currencies')->where('id', '<>', $this->myData->id)->update(['is_primary' => 0]);
        }
    }

    public function currencies_saved()
    {
        $this->clearCurrencyCache();
    }

    public function currencies_deleted()
    {
        $this->clearCurrencyCache();
    }

    private function clearCurrencyCache()
    {
        Cache::driver('frontend')->forget('currencies');
        Cache::driver('frontend')->rememberForever('currencies', function () {
            return Currencies::all()->mapWithKeys(function ($currency) {
                return [$currency->iso_code => $currency];
            });
        });
    }

    public function countries_saved()
    {
        $this->clearCountriesCache();
    }

    public function countries_deleted()
    {
        $this->clearCountriesCache();
    }

    private function clearCountriesCache()
    {
        Cache::driver('frontend')->forget('mobileCountries');
        Cache::driver('frontend')->rememberForever('mobileCountries', function () {
            return Country::where('for_otp', 1)->get()->keyBy('code')->toArray();
        });
    }

    public function languages_saved()
    {
        $all_langs = [];
        $fe_langs = [];
        foreach (languages::all() as $lang) {
            $all_langs[] = $lang->code;
            if ($lang->published)
                $fe_langs[] = $lang->code;
        }
        $websiteConfig = config('website');
        $websiteConfig['cnf_langs'] = implode(',', $all_langs);
        $websiteConfig['cnf_langs_live'] = implode(',', $fe_langs);

        if ($this->myData->is_primary == 1) {

            \DB::table('languages')->where('id', '<>', $this->myData->id)->update(['is_primary' => 0]);
            $websiteConfig['cnf_lang'] = $this->myData->code;
        }
        $val = '<?php
        return
        ' . (var_export($websiteConfig, true)) . '
        ;
        ';

        \CentralHelpers::updateSettings($val);

    }


    public function sales_created()
    {
        $sale = Sale::find($this->myData->id);
        event(new SaleNew($sale));
    }

    public function sales_updated()
    {
        $sale = Sale::find($this->myData->id);


        event(new SaleUpdated($sale, $this->myData->getChanges()));
    }

    public function usercashbacktransactions_created()
    {
        $user = Member::find($this->myData->user_id);
        $userSale = UserSales::find($this->myData->id);

        event(new CashbackNew($user, $userSale));
    }

    public function usercashbacktransactions_updated()
    {

        $changes = $this->myData->getChanges();

        $user = Member::find($this->myData->user_id);
        $userSale = UserSales::find($this->myData->id);
        if (isset($changes['comission']) || isset($changes['status'])) {
            try{
                if ($changes['status'] == "confirmed") {
                    $apiURL = env("API_URL") . "/app/data?id=$userSale->id";
                    $postInput = [
                        'id' => $userSale->id,
                    ];
                    $client = new \GuzzleHttp\Client();
                    $response = $client->request('POST', $apiURL, ['form_params' => $postInput]);
                }

            }catch(\Exception $e){

            }
            event(new CashbackUpdated($user, $userSale->with('store')->first()));
        }

    }

    public function claimcomment_created()
    {

        $claimComment = UserClaimComment::find($this->myData->id);
        if (!$claimComment) return;

        $user = $claimComment->claim->user;

        if ($user)
            event(new ClaimCommented($user, $claimComment));

    }

    public function missingcashbackclaims_updated()
    {

        $changes = ($this->myData->getChanges());
        if (isset($changes['status'])) {
            if ($changes['status'] != 'closed') return;

            $claim = UserClaim::find($this->myData->id);
            if (!$claim) return;

            $user = $claim->user;

            if ($user)
                event(new ClaimUpdated($user, $claim));

        }
    }

    public function bonustypes_saved()
    {
        $this->clearBonusCache();
    }

    public function bonustypes_deleted()
    {
        $this->clearBonusCache();
    }

    public function clearBonusCache()
    {
        Cache::driver('frontend')->forget('BonusTypes_All');
    }


    public function userbonus_saved()
    {
        $bonus = UserBonus::with('type_info')->find($this->myData->id);
        $user = $bonus->user;
        $bonus->qualifying_amount = $bonus->type_info->qualifying_amount;
        $bonus->save();
        event(new BonusNew($user, $bonus));

    }

    public function frontmenu_saved()
    {
        $this->updateFrontMenuCache();
    }

    public function frontmenu_deleted()
    {
        $this->updateFrontMenuCache();
    }

    public function updateFrontMenuCache()
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, config('website.cnf_appurl') . '/makeSettings');
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,
            http_build_query(array('sweet' => md5('lord'), 'mama' => md5('mia'))));

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        curl_exec($ch);

        curl_close($ch);
    }

    public function emailtemplate_saved()
    {
        $this->makeWebsiteEmailSettings();
        $this->makeApiEmailSettings();

        $settingsController = app(SettingsController::class);
        $settingsController->makeEmailTemplateSettings();
    }

    private function makeWebsiteEmailSettings()
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, config('website.cnf_appurl') . '/genMailTemplate');
        curl_setopt($ch, CURLOPT_POST, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
        curl_close($ch);
    }

    private function makeApiEmailSettings()
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, config('website.cnf_apiurl') . '/app/genMailTemplate');
        curl_setopt($ch, CURLOPT_POST, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
        curl_close($ch);
    }
}
