<?php
/**
 * This code is licensed under AGPLv3 license or Afterlogic Software License
 * if commercial version of the product was purchased.
 * For full statements of the licenses see LICENSE-AFTERLOGIC and LICENSE-AGPL3 files.
 */

namespace Aurora\Modules\TwoFactorAuth\Models;

use Aurora\System\Classes\Model;
use Aurora\Modules\Core\Models\User;

/**
 * Aurora\Modules\TwoFactorAuth\Models\UsedDevice
 *
 * @license https://www.gnu.org/licenses/agpl-3.0.html AGPL-3.0
 * @license https://afterlogic.com/products/common-licensing Afterlogic Software License
 * @copyright Copyright (c) 2023, Afterlogic Corp.
 * @package Api
 * @property integer $Id
 * @property integer $UserId
 * @property string $DeviceId
 * @property string $DeviceName
 * @property string $DeviceCustomName
 * @property string $AuthTokenHash
 * @property string|null $AuthTokenRaw
 * @property integer $CreationDateTime
 * @property integer $LastUsageDateTime
 * @property integer $TrustTillDateTime
 * @property string $DeviceIP
 * @property \Illuminate\Support\Carbon|null $CreatedAt
 * @property \Illuminate\Support\Carbon|null $UpdatedAt
 * @property-read mixed $entity_id
 * @method static int count(string $columns = '*')
 * @method static \Illuminate\Database\Eloquent\Builder|\Aurora\Modules\TwoFactorAuth\Models\UsedDevice find(int|string $id, array|string $columns = ['*'])
 * @method static \Illuminate\Database\Eloquent\Builder|\Aurora\Modules\TwoFactorAuth\Models\UsedDevice findOrFail(int|string $id, mixed $id, Closure|array|string $columns = ['*'], Closure $callback = null)
 * @method static \Illuminate\Database\Eloquent\Builder|\Aurora\Modules\TwoFactorAuth\Models\UsedDevice first(array|string $columns = ['*'])
 * @method static \Illuminate\Database\Eloquent\Builder|\Aurora\Modules\TwoFactorAuth\Models\UsedDevice firstWhere(Closure|string|array|\Illuminate\Database\Query\Expression $column, mixed $operator = null, mixed $value = null, string $boolean = 'and')
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice query()
 * @method static \Illuminate\Database\Eloquent\Builder|\Aurora\Modules\TwoFactorAuth\Models\UsedDevice where(Closure|string|array|\Illuminate\Database\Query\Expression $column, mixed $operator = null, mixed $value = null, string $boolean = 'and')
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereAuthTokenHash($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereCreationDateTime($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereDeviceIP($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereDeviceId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereDeviceName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\Aurora\Modules\TwoFactorAuth\Models\UsedDevice whereIn(string $column, mixed $values, string $boolean = 'and', bool $not = false)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereLastUsageDateTime($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereTrustTillDateTime($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereUpdatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|UsedDevice whereUserId($value)
 * @mixin \Eloquent
 */
class UsedDevice extends Model
{
    protected $table = 'security_used_devices';
    protected $foreignModel = User::class;
    protected $foreignModelIdColumn = 'UserId'; // Column that refers to an external table

    protected $fillable = [
        'Id',
        'UserId',
        'DeviceId',
        'DeviceName',
        'DeviceCustomName',
        'AuthTokenHash',
        'AuthTokenRaw',
        'CreationDateTime',
        'LastUsageDateTime',
        'TrustTillDateTime',
        'DeviceIP'
    ];

    public function toResponseArray()
    {
        $aResponse = parent::toResponseArray();
        $aResponse['Authenticated'] = false;
        if (\Aurora\Api::GetSettings()->StoreAuthTokenInDB) {
            // If AuthTokenRaw is set (during active request), verify via UserSession
            $sAuthToken = !empty($this->AuthTokenRaw) ? $this->AuthTokenRaw : null;
            if ($sAuthToken && !empty(\Aurora\System\Api::UserSession()->Get($sAuthToken))) {
                $aResponse['Authenticated'] = true;
            }
        } elseif (!empty($aResponse['AuthTokenHash'])) {
            $aResponse['Authenticated'] = true;
        }
        unset($aResponse['AuthTokenHash'], $aResponse['AuthTokenRaw']);
        return $aResponse;
    }
}
