<?php

namespace App\Traits;

use App\Company;
use App\Tools\SmsTools;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;


trait CpanelApi
{
    /**
     * @param Request $request
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
     */
    public function deywuro_clients(Request $request)
    {
        $clients = Company::query()->whereHas('users', function ($user) {
            $user->where('role_id', 2);
            $user->where('deleted_at', null);
        })->select('name', 'user_id', 'created_at')->get()->toJson();
        return response($clients);
    }

    /**
     * @param Request $request
     * @param User $user
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
     */
    public function client_report(Request $request, User $user)
    {
        return !empty($user) ? $this->client_api_report($request, $user) : response([]);
    }

    /**
     * @param Request $request
     * @param $user
     * @return array
     */
    private function client_api_report(Request $request, $user)
    {
        $date = Carbon::now();
        $from_date = Carbon::parse($date->toDateString());
        $to_date = clone $from_date;
        $to_date = Carbon::parse($to_date->addDays(1)->addSeconds(-1));

        //if from and to date are provided, use them to compute the reports
        if ($request->has('from_date') && $request->has('to_date')) {
            $from_date = Carbon::createFromFormat('Y-m-d', $request->get('from_date'));
            $to_date = Carbon::createFromFormat('Y-m-d', $request->get('to_date'));
        } else {
            $from_date->setDate($date->year, $date->month, $date->day);
            $to_date->setDate($date->year, $date->month, $date->day);
        }


        $data = DB::table('logs')->select(DB::raw('logs.status, count(*) as total'))
            ->where('user_id', '=', $user->id)
            ->whereBetween('submit_date', [$from_date, $to_date])
            ->groupBy('status')
            ->get();

        $tempArray = [];
        foreach ($data as $dat) {
            $status = str_replace("\n", "", $dat->status);
            $total = $dat->total;
            $tempArray["{$status}"] = $total;
        }

        $total_sms_sent = $user->logs()->whereBetween('submit_date', [
            $from_date->toDateTimeString(),
            $to_date->toDateTimeString()
        ])->count();


        $total_sms_delivered = isset($tempArray['DELIVRD']) ? $tempArray['DELIVRD'] : 0;
        $total_sms_ack = isset($tempArray['ACK/']) ? $tempArray['ACK/'] : 0;
        $total_sms_undelivered = isset($tempArray['UNDELIV']) ? $tempArray['UNDELIV'] : 0;
        $total_sms_expired = isset($tempArray['EXPIRED']) ? $tempArray['EXPIRED'] : 0;

        return [
            'date_range' => $from_date->toDateTimeString() . ' to ' . $to_date->toDateTimeString(),
            'total_sms_sent' => $total_sms_sent,
            'total_sms_delivered' => $total_sms_delivered,
            'total_sms_ack' => $total_sms_ack,
            'total_sms_undelivered' => $total_sms_undelivered,
            'total_sms_expired' => $total_sms_expired,
            'total_balance' => SmsTools::round_currency($user->credit->new_bal)
        ];
    }

    /**
     * @param User $user
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
     */
    public function log_24_report(User $user)
    {
        $_today = Carbon::today()->toDateString();
        $query = DB::table('logs')->where('user_id', $user->id)
            ->where('submit_date', '>', $_today)
            ->orderBy('submit_date', 'desc')->get()->toJson();
        return response($query);
    }

    /**
     * @param Request $request
     * @param User $user
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
     */
    public function log_24_report_by_date_range(Request $request, User $user)
    {
        //if from and to date are provided, use them to compute the reports
        $from_date = Carbon::createFromFormat('Y-m-d', $request->get('from_date'));
        $to_date = Carbon::createFromFormat('Y-m-d', $request->get('to_date'));

        $query = DB::table('logs')->where('user_id', $user->id)
            ->where('submit_date', '>=', $from_date->toDateString())
            ->where('submit_date', '<=', $to_date->toDateString())
            ->orderBy('submit_date', 'desc')->get()->toJson();
        return response($query);
    }


    /**
     * @param User $user
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
     */
    public function campaign_report(User $user)
    {
        $query = $user->jobs()->orderBy('sched_datetime', 'desc')->get()->toJson();
        return response($query);
    }

    /**
     * @param $id
     * @param User $user
     * @return \Illuminate\Http\JsonResponse
     */
    public function campaign_break($id, User $user)
    {
        $job = $user->jobs()->findOrFail($id);

        $data = DB::select('select `status`, count(*) as total from `logs`
                            where `user_id`=? AND `job_id`=? GROUP BY `status`', [
            $user->id,
            $job->id
        ]);

        $tempArray = [];
        foreach ($data as $dat) {
            $status = str_replace("\n", "", $dat->status);
            $total = $dat->total;
            $tempArray["{$status}"] = $total;
        }

        $total_sms_sent = $user->logs()->where('job_id', $job->id)->count();

        $total_sms_delivered = isset($tempArray['DELIVRD']) ? $tempArray['DELIVRD'] : 0;
        $total_sms_ack = isset($tempArray['ACK/']) ? $tempArray['ACK/'] : 0;
        $total_sms_undelivered = isset($tempArray['UNDELIV']) ? $tempArray['UNDELIV'] : 0;
        $total_sms_expired = isset($tempArray['EXPIRED']) ? $tempArray['EXPIRED'] : 0;


        $data = DB::select('select submit_date from `logs`
                            where `user_id`=? AND `job_id`=?
                            ORDER BY submit_date DESC LIMIT 0,1', [
            $user->id,
            $job->id
        ]);
        $submit_date = empty($data[0]->submit_date) ? 0 : $data[0]->submit_date;

        $delivery_time = 0;
        if (!empty($submit_date) && !empty($job->created_at))
            $delivery_time = Carbon::parse($submit_date)->diffInSeconds(Carbon::parse($job->created_at));

        $delivery_time /= 60.0;
        $delivery_time = round($delivery_time, 2);

        //TODO: get user error
        $user_error = 0;
        $handset_error = 0;
        $operator_error = 0;

        $values = [
            'date_range' => 'All',
            'total_sms_sent' => $total_sms_sent,
            'total_sms_delivered' => $total_sms_delivered,
            'total_sms_ack' => $total_sms_ack,
            'total_sms_undelivered' => $total_sms_undelivered,
            'total_sms_expired' => $total_sms_expired,
            'delivery_time' => $delivery_time,
            'user_error' => $user_error,
            'handset_error' => $handset_error,
            'operator_error' => $operator_error
        ];

        return response()->json($values);
    }

    /**
     * @param Request $request
     * @param $id
     * @param User $user
     * @return \Illuminate\Http\JsonResponse
     */
    public function campaign_break_by_date_range(Request $request, $id, User $user)
    {

        //if from and to date are provided, use them to compute the reports
        $from_date = Carbon::createFromFormat('Y-m-d', $request->get('from_date'))->toDateString();
        $to_date = Carbon::createFromFormat('Y-m-d', $request->get('to_date'))->toDateString();

        $job = $user->jobs()->findOrFail($id);

        $data = DB::table('logs')->select('status')
            ->where('user_id', $user->id)
            ->where('job_id', $job->id)
            ->where('submit_date', '>=', $from_date)
            ->where('submit_date', '<=', $to_date)
            ->groupBy(['status'])->get();


        $tempArray = [];
        foreach ($data as $dat) {
            $status = str_replace("\n", "", $dat->status);
            $total = $dat->total;
            $tempArray["{$status}"] = $total;
        }

        $total_sms_sent = $user->logs()->where('job_id', $job->id)
            ->where('submit_date', '>=', $from_date)
            ->where('submit_date', '<=', $to_date)
            ->count();

        $total_sms_delivered = isset($tempArray['DELIVRD']) ? $tempArray['DELIVRD'] : 0;
        $total_sms_ack = isset($tempArray['ACK/']) ? $tempArray['ACK/'] : 0;
        $total_sms_undelivered = isset($tempArray['UNDELIV']) ? $tempArray['UNDELIV'] : 0;
        $total_sms_expired = isset($tempArray['EXPIRED']) ? $tempArray['EXPIRED'] : 0;


        $data = DB::table('logs')->select('submit_date')
            ->where('user_id', $user->id)
            ->where('job_id', $job->id)
            ->where('submit_date', '>=', $from_date)
            ->where('submit_date', '<=', $to_date)
            ->orderBy('submit_date', 'desc')->first();

        $submit_date = empty($data[0]->submit_date) ? 0 : $data[0]->submit_date;

        $delivery_time = 0;
        if (!empty($submit_date) && !empty($job->created_at))
            $delivery_time = Carbon::parse($submit_date)->diffInSeconds(Carbon::parse($job->created_at));

        $delivery_time /= 60.0;
        $delivery_time = round($delivery_time, 2);

        //TODO: get user error
        $user_error = 0;
        $handset_error = 0;
        $operator_error = 0;

        $values = [
            'date_range' => $from_date . ' to ' . $to_date,
            'total_sms_sent' => $total_sms_sent,
            'total_sms_delivered' => $total_sms_delivered,
            'total_sms_ack' => $total_sms_ack,
            'total_sms_undelivered' => $total_sms_undelivered,
            'total_sms_expired' => $total_sms_expired,
            'delivery_time' => $delivery_time,
            'user_error' => $user_error,
            'handset_error' => $handset_error,
            'operator_error' => $operator_error
        ];

        return response()->json($values);
    }
}
