<?php

class P2Hash
{
    private const ALGO = 'sha256';
    private static $instance;
    private $password_options = [];

    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new P2Hash();
        }
        return self::$instance;
    }

    public function __construct()
    {
        global $_conf;

        if ($_conf['password_hash_low_spec']) {
            $this->get_low_spec_options();
        }
    }

    private function get_low_spec_options()
    {    
        $this->password_options = match (PASSWORD_DEFAULT) {
            PASSWORD_BCRYPT => [
                'cost' => 9,
            ],

            // それ以外のアルゴリズム（将来のPASSWORD_DEFAULT含む）が来た場合は、
            // 今の知識で軽量化しようとせず一旦PHPの標準に任せ、
            // PASSWORD_DEFAULTが切り替わったときにそのアルゴリズム用の軽量設定を追加するという運用を想定。
            default => [], 
        };
    }

    public function password_hash($password)
    {
        return password_hash($password, PASSWORD_DEFAULT, $this->password_options);
    }

    public function password_verify($password, $hash)
    {
        return password_verify($password, $hash);
    }

    public function password_needs_rehash($hash)
    {
        return password_needs_rehash($hash, PASSWORD_DEFAULT);
    }

    static public function hash($data, $binary = false)
    {
        return hash(self::ALGO, $data, $binary);
    }
}

