<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Support\Str;
use stdClass;

/**
 * Class Social
 *
 * @property int    $id
 * @property int    $user_id
 * @property string $network
 * @property string $uid
 * @property int    $created_at
 */
class Social extends BaseModel
{
    /**
     * Indicates if the model should be timestamped.
     */
    public $timestamps = false;

    /**
     * The attributes that aren't mass assignable.
     */
    protected $guarded = [];

    /**
     * Генерирует уникальный логин
     *
     * @param StdClass $network
     */
    public function generateLogin($network, string $delimiter = '-'): ?string
    {
        $firstName = ucfirst(Str::slug($network->first_name, $delimiter));
        $lastName = ucfirst(Str::slug($network->last_name, $delimiter));
        $firstLetter = $firstName[0];

        $variants = [];

        if (! empty($network->nickname)) {
            $variants[] = Str::slug($network->nickname, $delimiter);
        }

        $variants[] = $firstName;
        $variants[] = $firstName . $lastName;
        $variants[] = $firstName . $delimiter . $lastName;
        $variants[] = $lastName . $firstName;
        $variants[] = $lastName . $delimiter . $firstName;
        $variants[] = $firstLetter . $lastName;
        $variants[] = $firstLetter . $delimiter . $lastName;
        $variants[] = $lastName;

        if (! empty($network->bdate)) {
            [,, $year] = explode('.', $network->bdate);
            $shortYear = substr($year, -2);

            $variants[] = $firstName . $shortYear;
            $variants[] = $firstName . $year;
            $variants[] = $firstName . $delimiter . $shortYear;
            $variants[] = $firstName . $delimiter . $year;

            $variants[] = $firstName . $lastName . $shortYear;
            $variants[] = $firstName . $lastName . $year;
            $variants[] = $firstName . $delimiter . $lastName . $shortYear;
            $variants[] = $firstName . $delimiter . $lastName . $year;
            $variants[] = $firstName . $delimiter . $lastName . $delimiter . $shortYear;
            $variants[] = $firstName . $delimiter . $lastName . $delimiter . $year;

            $variants[] = $lastName . $firstName . $shortYear;
            $variants[] = $lastName . $firstName . $year;
            $variants[] = $lastName . $delimiter . $firstName . $shortYear;
            $variants[] = $lastName . $delimiter . $firstName . $year;
            $variants[] = $lastName . $delimiter . $firstName . $delimiter . $shortYear;
            $variants[] = $lastName . $delimiter . $firstName . $delimiter . $year;

            $variants[] = $firstLetter . $lastName . $shortYear;
            $variants[] = $firstLetter . $lastName . $year;
            $variants[] = $firstLetter . $lastName . $delimiter . $shortYear;
            $variants[] = $firstLetter . $lastName . $delimiter . $year;
            $variants[] = $firstLetter . $delimiter . $lastName . $shortYear;
            $variants[] = $firstLetter . $delimiter . $lastName . $year;
            $variants[] = $firstLetter . $delimiter . $lastName . $delimiter . $shortYear;
            $variants[] = $firstLetter . $delimiter . $lastName . $delimiter . $year;

            $variants[] = $lastName . $shortYear;
            $variants[] = $lastName . $year;
            $variants[] = $lastName . $delimiter . $shortYear;
            $variants[] = $lastName . $delimiter . $year;
        }

        foreach ($variants as $variant) {
            $variant = Str::substr($variant, 0, 20);

            if (! getUserByLogin($variant)) {
                return $variant;
            }
        }

        $i = 0;
        while (true) {
            $firstName = Str::substr($firstName, 0, 18);
            $login = $firstName . ++$i;

            if (! getUserByLogin($login)) {
                return $login;
            }
        }

        return false;
    }
}
