<?php

const VALI_NAME = 'string|regex:/^[a-z0-9_.-]+$/i|max:255';
const VALI_PASSWORD = 'string|min:6|max:1024';
const VALI_EMAIL = 'string|email|max:255';
const VALI_TEXT = 'string|max:4095';
const VALI_LINE = 'string|max:255';

const FEATURE_FORKS = false;
const FEATURE_FAVES = false;
const FEATURE_TABLE_COMMENTS = false;
const FEATURE_PROPOSALS = false;

// global helpers
function authed() {
    return ! \Auth::guest();
}

function guest() {
    return \Auth::guest();
}

/**
 * @return \App\Models\User|null
 */
function user() {
    return \Auth::user();
}

function ellipsis($s, $len) {
    return \MightyPork\Utils\Str::ellipsis($s, $len);
}

function faker() {
    static $fac = null;
    if ($fac !== null) return $fac;
    return $fac = Faker\Factory::create();
}

function dark_mode($ifDark=true, $ifLight=false) {
    return isset($_COOKIE["dark_mode"]) ? $ifDark : $ifLight;
}

/**
 * Recursively expand validation rules
 *
 * @param $arr
 * @return array
 */
function vali($arr) {
    $result = [];
    foreach ($arr as $key => $rules) {
        // top level
        if (is_array($rules)) {
            $ar = [];
            foreach ($rules as $rule) {
                if (is_string($rule) && strpos($rule, '|') !== false) {
                    foreach (explode('|', $rule) as $rr) {
                        $ar[] = $rr;
                    }
                } else if (is_array($rule)) {
                    // nested array, assume no further recursion
                    foreach ($rule as $rr) {
                        $ar[] = $rr;
                    }
                } else {
                    // Rule
                    $ar[] = $rule;
                }
            }
            $result[$key] = $ar;
        } else {
            // string or Rule
            $result[$key] = $rules;
        }
    }
    return $result;
}



/**
 * like old(), but decodes stringified json
 *
 * @param string $name
 * @param object|array $default
 * @return object|array
 */
function old_json($name, $default) {
    $old = old($name, null);
    if (is_string($old)) return json_decode($old);
    return $default;
}

// Safe JSON funcs
function toJSON($object, $emptyObj=false) {
    if ($emptyObj) {
        if ((empty($object) || ($object instanceof \Illuminate\Support\Collection && $object->count()==0))) {
            return '{}';
        }
    }

    if (!$object instanceof JsonSerializable && $object instanceof \Illuminate\Contracts\Support\Arrayable) {
        $object = $object->toArray();
    }

    return \GuzzleHttp\json_encode($object, JSON_UNESCAPED_SLASHES + JSON_UNESCAPED_UNICODE);
}

function fromJSON($object, $assoc=false) {
    return \GuzzleHttp\json_decode($object, $assoc);
}

/**
 * @param \Illuminate\Support\Collection|array $items
 * @param int $per_page
 * @param null|\Closure $mapFn
 * @return \Illuminate\Pagination\LengthAwarePaginator
 */
function collection_paginate($items, $per_page, $mapFn = null)
{
    if (!$items instanceof \Illuminate\Support\Collection) {
        $items = collect($items);
    }

    $page = Request::get('page', 1);

    $pageItems = $items->forPage($page, $per_page)->values();
    if (count($pageItems) == 0 && $page > 1) {
        $page = 1;
        Request::replace(['page' => $page]);
        $pageItems = $items->forPage($page, $per_page)->values();
    }

    return new Illuminate\Pagination\LengthAwarePaginator(
        $mapFn ? $pageItems->map($mapFn) : $pageItems,
        $items->count(),
        $per_page,
        Illuminate\Pagination\Paginator::resolveCurrentPage(),
        ['path' => Illuminate\Pagination\Paginator::resolveCurrentPath()]
    );
}