<?php

namespace App\Http\Controllers;

use App\Models\AnalyticsEvent;
use App\Models\Central;
use Illuminate\Http\Request;

class AnalyticsController extends GenericController
{
    protected $layout = "layouts.main";
    protected $data = array();
    public $module = 'analytics';
    static $per_page = '10';

    public function __construct()
    {
        $this->model = new AnalyticsEvent();
        parent::__construct();
    }

    public function setInfo()
    {
        $fields = [
            [
                'name' => 'user_id',
                'label' => 'User ID',
            ],
            [
                'name' => 'name',
                'label' => 'Event Name',
            ],
            [
                'name' => 'platform_id',
                'label' => 'Platform ID',
            ],
            [
                'name' => 'country',
                'label' => 'Country',
            ],
            [
                'name' => 'created_at',
                'label' => 'Event time',
                'type' => 'text_datetime',
            ],
            [
                'json_condition_key' => "data->>'$.utm_source'",
                'label' => 'UTM Source',
                'name' => 'event_data_utm_source',
                'type' => 'json',
            ],
            [
                'json_condition_key' => "data->>'$.utm_campaign'",
                'label' => 'UTM Campaign',
                'name' => 'event_data_utm_campaign',
                'type' => 'json',
            ],
            [
                'json_condition_key' => "data->>'$.utm_medium'",
                'label' => 'UTM Medium',
                'name' => 'event_data_utm_medium',
                'type' => 'json',
            ],
        ];
        $this->info = array_merge($this->info, ['config' => ['forms' => []]]);
        foreach ($fields as $field) {
            $fieldArray = [
                'search' => 1,
                'type' => $field['type'] ?? 'text',
                'field' => $field['name'],
                'alias' => 'analytics_events',
                'label' => $field['label'],
                'option' => '',
                'required' => ''
            ];
            if (isset($field['json_condition_key']))
                $fieldArray['json_condition_key'] = $field['json_condition_key'];
            $this->info['config']['forms'][] = $fieldArray;
        }
    }

    public function index(Request $request)
    {
        $access = $this->access;
        $pageModule = $this->module;

        $eventsCount = 5;
        if ($this->access['is_view'] == 0 && $this->access['is_search'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        else
            $eventsQuery = AnalyticsEvent::with(['platform', 'user']);

        if ($request->search) {
            $this->setInfo();
            $params = explode("|", trim($request->search, '|'));
            Central::buildWhere($eventsQuery, $params, '', '', $this->info['config']['forms']);
            if ($this->access['is_view'] == 0 && $this->access['is_search'] == 1) {
                $events = $eventsQuery->paginate(5);
                return view('manage.analytics.index', compact('events', 'eventsCount', 'access', 'pageModule'));
            }
        } else {
            if ($this->access['is_view'] == 0 && $this->access['is_search'] == 1) {
                $events = $eventsQuery;
                return view('manage.analytics.index', compact('events', 'eventsCount', 'access', 'pageModule'));
            }
        }

        $eventsCount = $eventsQuery->count();
        $events = $eventsQuery->paginate(15);
        return view('manage.analytics.index', compact('events', 'eventsCount', 'access', 'pageModule'));
    }

    public function show(Request $request, $id)
    {
        $eventObj = AnalyticsEvent::findOrFail($id);
        $event = $eventObj->toArray();
        $event['platfrom'] = $eventObj->platform->title;
        return view('manage.analytics.show', compact('event'));
    }

    public function getSearch($mode = 'native')
    {
        $this->info = $this->model->makeInfo($this->module);
        $this->setInfo();
        $this->data['pageModule'] = 'AnalyticsEvent';
        $this->data['pageUrl'] = '/manage/analytics/';
        $this->data['tableForm'] = $this->info['config']['forms'];
        $this->data['searchMode'] = $mode;
        return view('central.module.utility.search', $this->data);
    }

    public function getExport(Request $request, $t = 'excel')
    {
        $this->setInfo();
        $eventsQuery = AnalyticsEvent::leftJoin('platforms', 'platforms.id', '=', 'analytics_events.platform_id');
        if ($request->search) {
            $params = explode("|", trim(urldecode($request->search), '|'));
            Central::buildWhere($eventsQuery, $params, '', '', $this->info['config']['forms']);
        }

        $filename = $this->module . '_export ' . date('d-m-Y', time());
        return view('central.module.utility.csv', [
            'filename' => $filename,
            'query' => $eventsQuery,
            'headers' => $this->model->getExportHeaders(),
            'countColumn' => 'analytics_events.id'
        ]);
    }
}
