<?php

namespace App\Http\Controllers;

use App\Models\AnalyticsEvent;
use App\Services\AnalyticsReports\ActiveUserReport;
use App\Services\AnalyticsReports\FrequentActiveUserReport;
use App\Services\AnalyticsReports\FrequentLoyalUsersReport;
use App\Services\AnalyticsReports\LoyalUserReport;
use App\Services\AnalyticsReports\RegisteredUsersReport;
use App\Utils\AnalyticsReportTypes;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Yajny\Models\Country;

class AnalyticsDetailedReportController extends GenericController
{
    protected $layout = "layouts.main";
    protected $data = array();
    public $module = 'analytics_detailed_report';
    static $per_page = '25';

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

    public function index(Request $request)
    {
        $limit = null;
        if (!\Auth::check())
            return redirect('user/login')->with('status', 'error')->with('message', 'You are not login');

        $this->grab($request);
        if ($this->access['is_view'] == 0 && $this->access['is_search'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');

        if ($this->access['is_view'] == 0 && $this->access['is_search'] == 1)
            $limit = 5;

        $extraData = [];
        $reportUsersPaginator = null;

        if ($request->has(['report_type', 'range', 'user_type'])) {
            $reportType = $request->report_type;
            $range = explode('-', $request->range);
            $startDate = Carbon::make(trim($range[0]));
            $endDate = Carbon::make(trim($range[1]));
            $selectedCountry = $request->country;
            $selectedUserType = $request->user_type;

            switch ($reportType) {
                case AnalyticsReportTypes::ACTIVE_USERS:
                    $reportService = new ActiveUserReport($startDate, $endDate, $selectedCountry, $selectedUserType);
                    break;
                case AnalyticsReportTypes::LOYAL_USERS:
                    $reportService = new LoyalUserReport($startDate, $endDate, $selectedCountry, $selectedUserType);
                    break;
                case AnalyticsReportTypes::REGISTERED_USERS:
                    $reportService = new RegisteredUsersReport($startDate, $endDate, $selectedCountry, $selectedUserType);
                    break;
                case AnalyticsReportTypes::FREQUENT_ACTIVE_USERS:
                    $reportService = new FrequentActiveUserReport($startDate, $endDate, $selectedCountry, $selectedUserType);
                    break;
                case AnalyticsReportTypes::FREQUENT_LOYAL_USERS:
                    $reportService = new FrequentLoyalUsersReport($startDate, $endDate, $selectedCountry, $selectedUserType);
                    break;
                default:
                    return view('manage.analytics.detailed_report');
            }

            $reportQuery = $reportService->getQuery($limit)->select(array_values($reportService->getHeaders()));
            $reportUsersPaginator = $reportQuery->paginate(20);
            $reportUsersPaginator->appends(request()->query());

            if ($request->export) {
                if ($this->access['is_excel'] == 1) {
                    $filename = "report_{$reportType}_export " . date('d-m-Y', time()) . '.csv';
                    return view('central.module.utility.csv', [
                        'filename' => $filename,
                        'query' => $reportService->getQuery(),
                        'headers' => $reportService->getHeaders(),
                        'countColumn' => $reportService->getCountColumn()
                    ]);
                } else
                    throw new \Exception(__('core.note_restric'));
            }

            $extraData = [
                'selectedStartDate' => $startDate->toDateString(),
                'selectedEndDate' => $endDate->toDateString(),
                'selectedReportType' => $reportType,
                'selectedCountry' => $selectedCountry,
                'selectedUserType' => $selectedUserType
            ];
        }

        $countriesOptions = Country::all()->map(function ($country) {
            return ['id' => $country->code, 'text' => $country->name];
        })->toArray();

        return view('manage.analytics.detailed_report', array_merge([
            'reportUsersPaginator' => $reportUsersPaginator,
            'countries' => $countriesOptions
        ], $extraData, $this->data));
    }
}
