<?php

use App\Packages\User\Models\User;
use App\PackagesAdmin\Manager\Models\Manager;
use App\PackagesApi\Status\StatusCode;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Carbon;

/**
 * Get logged in employee.
 *
 * @return User
 */
function user()
{
	/** @var User $user */
	$user = Auth::guard('token')->user();

	return $user;
}

function phoneHash($phoneCode, $phoneNumber)
{
    return md5($phoneCode . $phoneNumber);
}

function validateNickname($nickname)
{
    $length = mb_strlen($nickname);
    $test = preg_match("/^[a-zA-Z0-9_]+[a-zA-Z0-9_.]+[a-zA-Z0-9_]+$/i", $nickname);

    if ($length >= 3 && $length <= 15 && $test)
    {
        return true;
    }

    return false;
}

/**
 * @param Builder $query
 *
 * @return string
 */
function rawSql($query)
{
    $sql = $query->toSql();
    $bindings = $query->getBindings();
    foreach ($bindings as $binding) {
        $value = is_numeric($binding) ? $binding : "'".$binding."'";
        $sql = preg_replace('/\?/', $value, $sql, 1);
    }

    return $sql;
}

function rawSqlArray($sql, $bindings)
{
    foreach ($bindings as $binding) {
        $value = is_numeric($binding) ? $binding : "'".$binding."'";
        $sql = preg_replace('/\?/', $value, $sql, 1);
    }

    return $sql;
}

function intMicroTime()
{
	return ceil(microtime(true));
}

/**
 *
 */
function ddd()
{
	array_map(function($x) {
		dump($x);
	}, func_get_args());
}

/**
 * Get logged in manager.
 *
 * @return Manager
 */
function managerUser()
{
	/** @var Manager $manager */
	$manager = Auth::guard(Manager::WEB_GUARD)->user();

	return $manager;
}

/**
 * @param $dateString
 * @return string
 * @throws Exception
 */
function formatDate($dateString)
{
    return Carbon::instance(new DateTime($dateString))->format('Y-m-d H:i:s');
}

/**
 * @param $awsKey
 *
 * @return string
 */
function previewAwsPath($awsKey)
{
    return  env('AWS_URL') . '/' . env('AWS_PREVIEW_BUCKET') . '/' . $awsKey;
}

/**
 * @param $awsKey
 *
 * @return string
 */
function previewAwsPathCDN($awsKey)
{
    return env('AWS_PREVIEW_CDN') ? env('AWS_PREVIEW_CDN') . '/' . $awsKey : previewAwsPath($awsKey);
}

/**
 * @param $awsKey
 *
 * @return string
 */
function videoAwsPath($awsKey)
{
    return  env('AWS_URL') . '/' . env('AWS_VIDEO_BUCKET') . '/' . $awsKey;
}

/**
 * @param $awsKey
 *
 * @return string
 */
function videoAwsPathCDN($awsKey)
{
    return env('AWS_VIDEO_CDN') ? env('AWS_VIDEO_CDN') . '/' . $awsKey : videoAwsPath($awsKey);
}

/**
 * @param $awsKey
 *
 * @return string
 */
function teaserAwsPath($awsKey)
{
    return env('AWS_URL') . '/' . env('AWS_TEASER_BUCKET') . '/' . $awsKey;
}

/**
 * @param $awsKey
 *
 * @return string
 */
function teaserAwsPathCDN($awsKey)
{
    return env('AWS_TEASER_CDN') ? env('AWS_TEASER_CDN') . '/' . $awsKey : teaserAwsPath($awsKey);
}

/**
 * @param $awsKey
 *
 * @return string
 */
function avatarAwsPath($awsKey)
{
    return env('AWS_URL') . '/' . env('AWS_AVATAR_BUCKET') . '/' . $awsKey;
}

/**
 * @param array $responseBody
 *
 * @return JsonResponse
 */
function jsonSuccess($responseBody = [])
{
	$responseBody['success'] = true;
	$responseBody['user_id'] = user() ? \user()->id : null;

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

/**
 * @param array $responseBody
 * @param int $statusCode
 *
 * @return JsonResponse
 */
function jsonError($responseBody, $statusCode)
{
	$responseBody['success'] = false;

	return response()->json($responseBody, $statusCode);
}

/**
 * @param array $responseBody
 *
 * @return JsonResponse
 */
function jsonErrorEntity($responseBody)
{
	$responseBody['success'] = false;

	return response()->json($responseBody, StatusCode::HTTP_INTERNAL_SERVER_ERROR);
}

/**
 * @param string $message
 *
 * @return JsonResponse
 */
function jsonErrorMessage($message)
{
    $responseBody = [
        'success' => false,
        'message' => $message
    ];

    return response()->json($responseBody, StatusCode::HTTP_INTERNAL_SERVER_ERROR);
}