<?php

namespace App\Models;

class Key
{
    public $key;
    public $status; # valid key = true, invalid key = false, unidentified key = null
    private $keyserver = "https://key.metager.de/";

    public function __construct($key, $status = null)
    {
        $this->key = $key;
        $this->status = $status;
        if (getenv("APP_ENV") !== "production") {
            $this->keyserver = "https://dev.key.metager.de/";
        }
    }

    # always returns true or false
    public function getStatus()
    {
        if ($this->key !== '' && $this->status === null) {
            $this->updateStatus();
        }
        if ($this->status === null || $this->status === false) {
            return false;
        } else {
            return true;
        }
    }

    
    public function updateStatus()
    {
        try {
            $link = $this->keyserver . urlencode($this->key) . "/request-permission/api-access";
            $result = json_decode(file_get_contents($link));
            if ($result->{'api-access'} == true) {
                $this->status = true;
                return true;
            } else {
                $this->status = false;
                return false;
            }
        } catch (\ErrorException $e) {
            return false;
        }
    }

    public function requestPermission()
    {
        $postdata = http_build_query(array(
            'dummy' => 0,
        ));
        $opts = array(
            'http' => array(
                'method' => 'POST',
                'header' => 'Content-type: application/x-www-form-urlencoded',
                'content' => $postdata,
            ),
        );

        $context = stream_context_create($opts);

        try {
            $link = $this->keyserver . urlencode($this->key) . "/request-permission/api-access";
            $result = json_decode(file_get_contents($link, false, $context));
            if ($result->{'api-access'} == true) {
                return true;
            } else {
                $this->status = false;
                return false;
            }
        } catch (\ErrorException $e) {
            return false;
        }
    }
}