<?php
/**
 * Created by PhpStorm.
 * User: software
 * Date: 10/19/17
 * Time: 2:03 PM
 */

namespace App\Http\Controllers\Ads;


use App\DataTables\AudienceDatatable;
use App\Http\Controllers\Controller;
use App\Language;
use App\Tools\TMNTools;
use Illuminate\Support\Facades\DB;

// centralized ads system:
// contact damian [adamian@npontu.com] for explanation if any. thanks
class AudienceController extends Controller
{
    private $tool;
    public function __construct()
    {
        $this->tool = new TMNTools();
    }

    public function index(AudienceDatatable $table)
    {
        return $table->render("ads/audience/index", [
            'base' => $this->tool->base(),
            'create' => $this->tool->route('aud.create')
        ]);
    }

    public function view()
    {
        $_user  = auth()->user();
        $item   = $_user->audiences()->findOrFail(request()->route('id'));
        $nodes  = $this->tool->nodes();

        // update state of selected nodes
        foreach ($nodes as &$node)
        {
            $node['state']['disabled'] = true;
            if (in_array($node['id'], $item->nodes))
            {
                $node['state']['selected'] = true;
            }
        }

        return view('ads/audience/view', [
            'base'  =>  $this->tool->base(),
            'index' =>  $this->tool->route('aud.index'),
            'edit'  =>  $this->tool->route('aud.edit'),
            'sms'   =>  $this->tool->route('sms.send'),
            'email' =>  $this->tool->route('email.send'),
            'data'  =>  $item,
            'info'  =>  (object) $item->filters,
            'grid'  =>  json_encode($nodes)
        ]);

    }

    public function create()
    {
        if (strtoupper(request()->method()) == 'POST')
        {
            $_user = auth()->user();
            $this->validate(request(), ['name' => 'required|min:6']);

            DB::transaction(function() use (&$_user) {
                $data   = request()->except(['_token']);
                // handle city
                $city   = isset($data['city']) ? $data['city'] : null;
                $data['city'] = $city != null ? explode(',', $city) : [];
                $filter = $this->tool->filterize($data);
                $nodes  = isset($data['nodes']) ? json_decode($data['nodes'], true) : [];
                $inputs = [
                    'name'      => $data['name'],
                    'nodes'     => $nodes,
                    'mode'      => $data['mode'],
                    'filters'   => $filter
                ];
                $item = $_user->audiences()->create($inputs);
                session()->flash('success', 'The Audience ' .strtoupper($item->name). ' was successfully added!');
            });
            return redirect()->route($this->tool->route('aud.index'));
        }


        return view('ads/audience/create', [
            'base'      => $this->tool->base(),
            'index'     => $this->tool->route('aud.index'),
            'languages' => Language::orderBy('name')->get(),
            'regions'   => $this->tool->regions(),
        ]);
    }

    public function edit()
    {
        $_user  = auth()->user();
        $item   = $_user->audiences()->findOrFail(request()->route('id'));

        if (strtoupper(request()->method()) == 'POST')
        {
            $_user = auth()->user();
            $this->validate(request(), ['name' => 'required|min:6']);

            DB::transaction(function() use (&$item, &$_user) {
                $data   = request()->except(['_token']);
                // handle city
                $city   = isset($data['city']) ? $data['city'] : null;
                $data['city'] = $city != null ? explode(',', $city) : [];

                $filter = $this->tool->filterize($data);
                $nodes  = json_decode($data['nodes'], true);
                $inputs = [
                    'name'      => $data['name'],
                    'nodes'     => $nodes,
                    'mode'      => $data['mode'],
                    'filters'   => $filter
                ];
                $item->update($inputs);
                session()->flash('success', 'The Audience ' .strtoupper($item->name). ' was successfully updated!');
            });
            return redirect()->route($this->tool->route('aud.index'));
        }

        $check = [];
        $nodes = $this->tool->nodes();

        // update state of selected nodes
        foreach ($nodes as &$node)
        {
            if (in_array($node['id'], $item->nodes))
                $node['state']['selected'] = true;
        }

        // extract from filter
        foreach ($item->filters as $key => $val)
        {
            $main = ['country', 'region', 'city', 'age_from', 'age_to', 'gender', 'language'];
            if (!in_array($key, $main))
                continue;

            $check[$key] = $val;
        }

        return view('ads/audience/edit', [
            'base'      => $this->tool->base(),
            'index'     => $this->tool->route('aud.index'),
            'languages' => Language::orderBy('name')->get(),
            'regions'   => $this->tool->regions(),
            'data'      => $item,
            'check'     => (object) $check,
            'grid'      => json_encode($nodes)
        ]);
    }

    public function delete()
    {
        $_user  = auth()->user();
        $item   = $_user->audiences()->findOrFail(request()->route('id'));

        $item->delete();
        session()->flash('success', 'The Audience "'.strtoupper($item->name).'" was successfully deleted!');
        return redirect()->route($this->tool->route('aud.index'));
    }
}