<?php

namespace App;

use OTPHP\HOTP;
use OTPHP\Factory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Illuminate\Contracts\Encryption\DecryptException;

class TwoFAccount extends Model
{
    /**
     * model's array form.
     *
     * @var array
     */
    protected $fillable = ['service', 'account', 'uri', 'icon'];


    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'twofaccounts';


    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = ['type', 'counter'];


    /**
     * Null empty icon resource has gone
     *
     * @param  string  $value
     * @return string
     */
    public function getIconAttribute($value)
    {
        if (\App::environment('testing') == false) {
            if( !Storage::exists('public/icons/' . $value) ) {

                return '';
            }
        }

        return $value;
    }


    /**
     * Prevent setting a missing icon
     *
     * @param  string  $value
     * @return string
     */
    public function setIconAttribute($value)
    {

        if( !Storage::exists('public/icons/' . $value) && \App::environment('testing') == false ) {

            $this->attributes['icon'] = '';
        }
        else {

            $this->attributes['icon'] = $value;
        }
    }



    /**
    * Get the account type.
    *
    * @return string
    */
    public function getTypeAttribute()
    {
        
        return substr( $this->uri, 0, 15 ) === "otpauth://totp/" ? 'totp' : 'hotp';
    }

    /**
    * Get the account counter in case of HOTP.
    *
    * @return integer
    */
    public function getCounterAttribute()
    {
        
        if( $this->type === 'hotp' ) {
            $otp = Factory::loadFromProvisioningUri($this->uri);

            return $otp->getCounter();
        }

        return null;
    }


    /**
     * Set the user's first name.
     *
     * @param  string  $value
     * @return void
     */
    // public function setUriAttribute($value)
    // {
    //     $this->attributes['uri'] = encrypt($value);
    // }

    /**
     * Get the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    // public function getUriAttribute($value)
    // {
    //     try {

    //         return decrypt($value);

    //     } catch (DecryptException $e) {

    //         return null;
    //     }

    // }

}