<?php
namespace App\Core\Library;
require 'vendor/autoload.php';
use Gregwar\Captcha\CaptchaBuilder;
use Gregwar\Captcha\PhraseBuilder;

class Captcha 
{
    private static $capcha_secret;
    private static $hash_algo     = 'sha256';

    private static function setSecret() {
        self::$capcha_secret = $_ENV['CAPCHA_SECRET']?$_ENV['CAPCHA_SECRET']:'sansoftwares1806';
    }

    public static function create() {
        try {
            self::setSecret();
            $phraseBuilder = new PhraseBuilder(4);
            $builder = new CaptchaBuilder(null, $phraseBuilder);
            $builder->build();
            $text = $builder->getPhrase();
            $hash = hash_hmac(self::$hash_algo, strtolower($text), self::$capcha_secret);
            ob_start();
            $builder->output();
            $imageData = base64_encode(ob_get_clean());

            return [
                "status" => true,
                'image'  => 'data:image/jpeg;base64,' . $imageData,
                'hash'   => $hash
            ];

        } catch(\Exception $e) {
            return ["status"=>false, "error"=>$e->getMessage()];
        }
    }

    public static function createMathCaptcha() {
        try {
            self::setSecret();
            $num1 = rand(1, 9);
            $num2 = rand(1, 9);
            $operators = ['+', '*'];
            $operator = $operators[array_rand($operators)];
            $question = "$num1 $operator $num2";
            switch ($operator) {
                case '+': $answer = $num1 + $num2; break;
                case '-': $answer = $num1 - $num2; break;
                case '*': $answer = $num1 * $num2; break;
            }            
            $hash = hash_hmac(self::$hash_algo, (string)$answer, self::$capcha_secret);

            $builder = new CaptchaBuilder($question);
            $builder->setDistortion(false);
            $builder->setMaxBehindLines(0);
            $builder->setMaxFrontLines(0);
            $builder->setBackgroundColor(255, 255, 255);
            $builder->build();
            ob_start();
            $builder->output();
            $imageData = base64_encode(ob_get_clean());

            return [
                "status" => true,
                'image'  => 'data:image/jpeg;base64,' . $imageData,
                'hash'   => $hash,
                'question' => $question
            ];
        } catch(\Exception $e) {
            return ["status"=>false, "error"=>$e->getMessage()];
        }
    }

    public static function verify($input, $capcha_hash) {
        try {
            self::setSecret();
            $hash = hash_hmac(self::$hash_algo, strtolower($input), self::$capcha_secret);
            if (hash_equals($capcha_hash, $hash)) {
                return ["status"=>true];
            } else {
                return ["status"=>false, "error"=>"Invalid CAPTCHA!"];
            }
        } catch(\Exception $e) {
            return ["status"=>false, "error"=>$e->getMessage()];
        }
    }

    public static function verifyMathCaptcha($input, $capcha_hash) {
        try {
            self::setSecret();
            $hash = hash_hmac(self::$hash_algo, (string)$input, self::$capcha_secret);
            if (hash_equals($capcha_hash, $hash)) {
                return ["status"=>true];
            } else {
                return ["status"=>false, "error"=>"Invalid CAPTCHA!"];
            }
        } catch(\Exception $e) {
            return ["status"=>false, "error"=>$e->getMessage()];
        }
    }
}