<?php
namespace Site\Test;

require_once __DIR__.'/../../../autoload.php';

use Site\Lib\Tester;
use Site\Lib\Auth;

if (AUTH_ENABLED) {
  $test = new Tester([
    'colorOutput' => true,
    'verboseOutput' => true
  ]);

  if (AUTH_REGISTER_ENABLED) {
    $test->describe('ユーザー登録', function($test): void {
      $test->it('アカウントを作成出来るはず', function($test): void {
        $user = "admin1234";
        $pass = "testTEST1234!#$%@[]:;";
        $passVerify = "testTEST1234!#$%@[]:;";
        $email = "test@076.co.jp";

        $auth = new Auth();
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = true;

        $test->assertNotNull($res);
        $test->assertEquals($res->isSuccess, $expect);
      });

      $test->it('空フィールドでアカウントを作成出来ないはず', function($test): void {
        $user = "";
        $pass = "testTEST1234!#$%@[]:;";
        $passVerify = "testTEST1234!#$%@[]:;";
        $email = "test@076.ne.jp";

        $auth = new Auth();
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：ユーザー名をご入力下さい。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);

        $user = "admin5678";
        $pass = "";
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：パスワードをご入力下さい。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);

        $pass = "testTEST1234!#$%@[]:;";
        $email = "";
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：メールアドレスをご入力下さい。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);
      });

      $test->it('既にユーザー名やメールアドレスが存在するアカウントを作成出来ないはず', function($test): void {
        $user = "admin1234";
        $pass = "testTEST1234!#$%@[]:;";
        $passVerify = "testTEST1234!#$%@[]:;";
        $email = "test@076.ne.jp";

        $auth = new Auth();
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'ユーザー「admin1234」は既に存在します。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);

        $user = "admin5678";
        $email = "test@076.co.jp";
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'ユーザー「test@076.co.jp」は既に存在します。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);
      });

      $test->it('一致しない、短い、又は不安なパスワードでアカウントを作成出来ないはず', function($test): void {
        $user = "admin5678";
        $pass = "testtest1234!#$%@[]:;";
        $passVerify = "testTEST1234!#$%@[]:;";
        $email = "test@076.ne.jp";

        $auth = new Auth();
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：パスワードは一致していません。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);

        $pass = "testTEST1234";
        $passVerify = "testTEST1234";
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：パスワードは20以上をご入力下さい。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);

        $pass = "testTEST1234testTEST";
        $passVerify = "testTEST1234testTEST";
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：パスワードは2つ以上の大文字、2つ以上の小文字、2つ以上の数字、及び2つ以上の特別文字を含む事が必須です。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);
      });

      $test->it('不正なメールアドレスでアカウントを作成出来ないはず', function($test): void {
        $user = "admin5678";
        $pass = "testTEST1234!#$%@[]:;";
        $passVerify = "testTEST1234!#$%@[]:;";
        $email = "test@076.niggerballs";

        $auth = new Auth();
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：メールアドレスは不正です。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);

        $email = "test@076";
        $res = $auth->mkUser($user, $pass, $passVerify, $email);

        $expect = 'エラー：メールアドレスは不正です。'.'<br />';

        $test->assertNotNull($res);
        $test->assertEquals($res->message, $expect);
      });

      // ユーザーの削除
      $users = scandir(ROOT.'/data/user');
      $userFile = '';
      foreach ($users as $u) {
        if (str_contains($u, 'admin1234')) {
          $userFile = $u;
          break;
        }
      }
      unlink(ROOT.'/data/user/'.$userFile);
      rmdir(ROOT.'/public/static/user/admin1234');
    });
  }

  // TODO: CLIからクッキーを設定出来ないから、「Site\Lib\Auth::getUserData(): Return value must be of type stdClass, null returned」って発生する・・・
  // $test->describe('ログインとログアウト', function($test): void {
  //   $user = "admin1234";
  //   $pass = "testTEST1234!#$%@[]:;";
  //   $passVerify = "testTEST1234!#$%@[]:;";
  //   $email = "test@076.co.jp";

  //   $auth = new Auth();
  //   $res = $auth->mkUser($user, $pass, $passVerify, $email);
  //   unset($auth);

  //   $test->it('正しい認証情報でログイン出来るはず', function($test) use ($user, $pass): void {
  //     $auth = new Auth();
  //     $res = $auth->setToken($user, $pass);

  //     $test->assertTrue($res->isSuccess);
  //     $test->assertEquals('ログイン成功', $res->message);

  //     $auth2 = new Auth();
  //     $usr = $auth2->getLoggedInUser();

  //     $test->assertNotNull($usr);
  //     $test->assertEquals($user, $usr->username);
  //   });

  //   $test->it('間違ったパスワードでログイン出来ないはず', function($test) use ($user): void {
  //     $auth = new Auth();
  //     $res = $auth->setToken($user, 'fuseipassword');

  //     $test->assertFalse($res->isSuccess);
  //     $test->assertEquals('ユーザー名又はパスワードが一致していません', $res->message);
  //   });

  //   $test->it('存在しないユーザーでログイン出来ないはず', function($test) use ($pass): void {
  //     $auth = new Auth();
  //     $res = $auth->setToken('fumeiuser', $pass);

  //     $test->assertFalse($res->isSuccess);
  //     $test->assertEquals('ユーザー名又はパスワードが一致していません', $res->message);
  //   });

  //   $test->it('ログアウト出来るはず', function($test) use ($user, $pass): void {
  //     $auth = new Auth();
  //     $auth->setToken($user, $pass);

  //     $res = $auth->logout();

  //     $test->assertTrue($res->isSuccess);
  //     $test->assertEquals('ログイン成功', $res->message);

  //     $auth2 = new Auth();
  //     $usr = $auth2->getLoggedInUser();

  //     $test->assertNull($usr);
  //   });

  //   // ユーザーの削除
  //   $users = scandir(ROOT.'/data/user');
  //   $userFile = '';
  //   foreach ($users as $u) {
  //     if (str_contains($u, 'admin1234')) {
  //       $userFile = $u;
  //       break;
  //     }
  //   }
  //   unlink(ROOT.'/data/user/'.$userFile);
  //   rmdir(ROOT.'/public/static/user/admin1234');
  // });

  $test->printSummary();
}