/**
 * プラグイン規定関数::ブロック型で呼び出された場合の処理
 * 認証済みの場合: 何もしない(空の画面を生成する)
 * 認証情報が指定されている場合: 認証処理を行う
 * 認証情報が指定されていない場合: 認証画面を生成する
 *
 * 引数: なし
 *
 * @return string 画面(html)
 */
function plugin_movieviewer_auth_convert()
{
    global $vars;
    $manager = plugin_movieviewer_get_auth_manager();
    $req_user_id = filter_input(INPUT_POST, "movieviewer_user");
    // 認証開始
    if ($req_user_id !== null && $req_user_id !== "") {
        try {
            plugin_movieviewer_validate_csrf_token();
        } catch (MovieViewerValidationException $ex) {
            return plugin_movieviewer_auth_move_to_authpage(true);
        }
        try {
            plugin_movieviewer_validate_user_id($req_user_id);
        } catch (MovieViewerValidationException $ex) {
            return plugin_movieviewer_auth_move_to_authpage(true);
        }
        try {
            $maybe_user = plugin_movieviewer_get_user_repository()->findById($req_user_id);
        } catch (MovieViewerRepositoryObjectNotFoundException $ex) {
            plugin_movieviewer_auth_move_to_authpage(true);
        }
        $user_password = filter_input(INPUT_POST, 'movieviewer_password');
        if (!$maybe_user->verifyPassword($user_password)) {
            return plugin_movieviewer_auth_move_to_authpage(true);
        }
        $manager->login($maybe_user);
        return '';
    }
    // 認証済み
    if ($manager->isAuthenticated()) {
        return '';
    }
    // 認証なし
    return plugin_movieviewer_auth_move_to_authpage(false);
}
/**
 * [アクション] 入金を確定させ、結果画面を生成する
 *
 * @return array ページ名, 画面(html)
 */
function plugin_movieviewer_review_purchase_confirm_payment_action_execute()
{
    $page = plugin_movieviewer_get_current_page();
    try {
        plugin_movieviewer_validate_csrf_token();
    } catch (MovieViewerValidationException $ex) {
        return plugin_movieviewer_action_error_response($page, "不正なリクエストです。");
    }
    $ids = filter_input(INPUT_POST, 'purchase_requests', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
    foreach ($ids as $req_id) {
        try {
            plugin_movieviewer_validate_review_pack_request_id($req_id);
        } catch (MovieViewerValidationException $ex) {
            return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。");
        }
    }
    $requests = array();
    foreach ($ids as $req_id) {
        try {
            $request = plugin_movieviewer_get_review_pack_purchase_request_repository()->findById($req_id);
        } catch (MovieViewerRepositoryObjectNotFoundException $ex) {
            return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。");
        }
        $requests[] = $request;
    }
    if (count($requests) === 0) {
        return plugin_movieviewer_action_error_response($page, "申し込みが見つかりません。");
    }
    $date_begin = filter_input(INPUT_POST, 'viewing_perod_date_begin', FILTER_DEFAULT);
    try {
        plugin_movieviewer_validate_ymd($date_begin);
    } catch (MovieViewerValidationException $ex) {
        return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。");
    }
    $date_begin = new DateTime($date_begin);
    $settings = plugin_movieviewer_get_global_settings();
    $service = new MovieViewerReviewPackPurchaseConfirmationService($settings);
    $hsc = "plugin_movieviewer_hsc";
    $content_rows = "";
    foreach ($requests as $request) {
        $confirmation = $service->confirm($request, $date_begin);
        $content_row = <<<TEXT
        <tr>
          <td>{$hsc($request->getUser()->lastName)} {$hsc($request->getUser()->firstName)}</td>
          <td>{$hsc($request->getUser()->id)}</td>
          <td>{$hsc($request->describePack())}</td>
          <td>{$hsc($request->getDateRequested()->format("Y/m/d H:m:s"))}</td>
          <td>{$hsc($confirmation->getViewingPeriod()->date_begin->format("Y/m/d"))}</td>
          <td>{$hsc($confirmation->getViewingPeriod()->date_end->format("Y/m/d"))}</td>
        </tr>
TEXT;
        $content_rows .= $content_row;
    }
    $content = <<<TEXT
    <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
    <link href="https://code.jquery.com/ui/1.12.0/themes/cupertino/jquery-ui.css" rel="stylesheet">
    <link href="plugin/movieviewer/assets/css/movieviewer.css" rel="stylesheet">
    <h2>入金確認完了</h2>
    <p>
      以下の申し込みの入金を確定しました。
    </p>
    <p>
    <table class="table purchase-requests">
      <thead>
      <tr>
        <th>名前</th>
        <th>メールアドレス</th>
        <th>受講対象</th>
        <th>申込日</th>
        <th>視聴期限(開始)</th>
        <th>視聴期限(終了)</th>
      </tr>
      </thead>
      <tbody>
        {$content_rows}
      <tbody>
    </table>
    </p>
TEXT;
    return array('msg' => $page, 'body' => $content);
}
/**
 * プラグイン規定関数::アクション型で呼び出された場合の処理
 * 申し込みの確定と通知メール(ユーザ、スタッフ)を送り、結果画面を生成する
 * 
 * 引数: string request_stash_id 申し込み仮ID
 * 
 * 注意: 単独で呼び出さないこと(convertの画面と連携している)
 *
 * @return array ページ名、画面(html)
 */
function plugin_movieviewer_review_purchase_start_action()
{
    $from_external_link = false;
    $test_var = filter_input(INPUT_POST, "request_stash_id");
    if (empty($test_var)) {
        $from_external_link = true;
    }
    if ($from_external_link) {
        $request_stash_id = filter_input(INPUT_GET, "request_stash_id");
    } else {
        $request_stash_id = filter_input(INPUT_POST, "request_stash_id");
    }
    if (!$from_external_link) {
        try {
            plugin_movieviewer_validate_csrf_token();
        } catch (MovieViewerValidationException $ex) {
            return plugin_movieviewer_action_error_response($page, "不正なリクエストです。");
        }
    }
    try {
        $user = plugin_movieviewer_get_current_user();
    } catch (MovieViewerRepositoryObjectNotFoundException $ex) {
        return plugin_movieviewer_action_error_response($page, "ログインが必要です。");
    }
    if ($user->mailAddress === null || $user->mailAddress === "") {
        return plugin_movieviewer_action_error_response($page, "メールアドレスが登録されていません。");
    }
    $settings = plugin_movieviewer_get_global_settings();
    $service = new MovieViewerReviewPackPurchaseRequestService($settings);
    $request = null;
    try {
        $request = $service->doRequest($user, $request_stash_id);
    } catch (Exception $ex) {
        return plugin_movieviewer_action_error_response($page, $ex->getMessage());
    }
    if ($request->purchase_method === "bank") {
        $messages = plugin_movieviewer_review_purchase_start_action_bank($settings, $user, $request);
    } else {
        if ($request->purchase_method === "credit") {
            $messages = plugin_movieviewer_review_purchase_start_action_credit($settings, $user, $request);
        }
    }
    $page = plugin_movieviewer_get_current_page();
    $back_uri = plugin_movieviewer_get_home_uri();
    $content = <<<TEXT
    <link href="https://code.jquery.com/ui/1.11.4/themes/redmond/jquery-ui.css" rel="stylesheet">
    <link href="plugin/movieviewer/assets/css/movieviewer.css" rel="stylesheet">
    <h2>再視聴申し込み完了</h2>
    <p>
    {$messages}
    </p>
    <p>
    <a href="{$back_uri}" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>マイページに戻る</a>
    </p>
TEXT;
    return array("msg" => $page, "body" => $content);
}
/**
 * プラグイン規定関数::アクション型で呼び出された場合の処理
 * 申し込みを確定させる
 * 
 * 引数: string purchase_method 支払い区分(bank, credit)
 *      string deal_pack_id 受講パックID
 * 
 * 注意: 単独で呼び出さないこと(convertの画面と連携している)
 *
 * @return array ページ名、画面(html)
 */
function plugin_movieviewer_purchase_start_action()
{
    $page = plugin_movieviewer_get_current_page();
    $from_external_link = false;
    $test_var = filter_input(INPUT_POST, "purchase_method");
    if (empty($test_var)) {
        $from_external_link = true;
    }
    if ($from_external_link) {
        $deal_pack_id = filter_input(INPUT_GET, "deal_pack_id");
        $purchase_method = filter_input(INPUT_GET, "purchase_method");
    } else {
        $deal_pack_id = filter_input(INPUT_POST, "deal_pack_id");
        $purchase_method = filter_input(INPUT_POST, "purchase_method");
    }
    if (!$from_external_link) {
        try {
            plugin_movieviewer_validate_csrf_token();
        } catch (MovieViewerValidationException $ex) {
            return plugin_movieviewer_action_error_response($page, "不正なリクエストです。");
        }
    }
    try {
        $user = plugin_movieviewer_get_current_user();
    } catch (MovieViewerRepositoryObjectNotFoundException $ex) {
        return plugin_movieviewer_action_error_response($page, "ログインが必要です。");
    }
    if ($user->mailAddress === null || $user->mailAddress === "") {
        return plugin_movieviewer_action_error_response($page, "メールアドレスが登録されていません。");
    }
    try {
        plugin_movieviewer_validate_deal_pack_id($deal_pack_id);
    } catch (MovieViewerValidationException $ex) {
        return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。");
    }
    try {
        plugin_movieviewer_validate_purchase_method($purchase_method);
    } catch (MovieViewerValidationException $ex) {
        return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。");
    }
    $settings = plugin_movieviewer_get_global_settings();
    $offer_maker = new MovieViewerDealPackOfferMaker($settings->payment, $user);
    if (!$offer_maker->canOffer()) {
        return plugin_movieviewer_action_error_response($page, "ご指定のコースはすでに申し込み済み、または、受講できなくなりました。");
    }
    $offer = $offer_maker->getOffer();
    if ($offer->getPackId() !== $deal_pack_id) {
        return plugin_movieviewer_action_error_response($page, "ご指定のコースはすでに申し込み済み、または、受講できなくなりました。");
    }
    $offer->accept();
    if ($purchase_method === "bank") {
        $price_with_notes = plugin_movieviewer_render_dealpack_offer_price($offer, true);
        $mail_builder = new MovieViewerDealPackBankTransferInformationMailBuilder($settings->mail);
        $mail = $mail_builder->build($user, $offer->getPackName(), $price_with_notes, $offer->getPaymentGuide()->bank_transfer, $offer->getPaymentGuide()->deadline);
        $result = $mail->send();
        if (!$result) {
            MovieViewerLogger::getLogger()->addError("案内通知エラー", array("error_statement" => $mail->ErrorInfo));
            return plugin_movieviewer_action_error_response($page, "メールの送信に失敗しました。{$settings->contact['name']}に問い合わせしてください。");
        }
        $messages = <<<TEXT
        ご登録のアドレスに振込先等のご案内をお送りしています。<br>
        ご確認の上、お振込を期限までに完了してください。<br>
        現在の状況をマイページに戻って、ご確認ください。
TEXT;
    } else {
        if ($purchase_method === "credit") {
            $messages = <<<TEXT
        クレジットカードでの支払いが完了しました。<br>
        現在の状況をマイページに戻って、ご確認ください。<br>
        なおシステムの関係上、入金の確認には、しばらくお時間がかかることがありますので、ご了承ください。
TEXT;
        }
    }
    $hsc = "plugin_movieviewer_hsc";
    $back_uri = plugin_movieviewer_get_home_uri();
    $content = <<<TEXT
    <link href="https://code.jquery.com/ui/1.11.4/themes/redmond/jquery-ui.css" rel="stylesheet">
    <link href="plugin/movieviewer/assets/css/movieviewer.css" rel="stylesheet">
    <h2>受講申し込み完了</h2>
    <p>
    {$messages}
    </p>
    <p>
    <a href="{$back_uri}" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>マイページに戻る</a>
    </p>
TEXT;
    return array("msg" => $page, "body" => $content);
}
/**
 * [アクション] パスワードをリセットし、結果画面を生成する
 *
 * @return array ページ名, 画面(html)
 */
function plugin_movieviewer_reset_password_action_reset()
{
    $page = plugin_movieviewer_get_current_page();
    try {
        plugin_movieviewer_validate_csrf_token();
    } catch (MovieViewerValidationException $ex) {
        return plugin_movieviewer_reset_password_error("不正なリクエストです。");
    }
    $token_id = filter_input(INPUT_POST, 'token');
    try {
        $token = plugin_movieviewer_get_user_reset_password_token_repository()->findById($token_id);
    } catch (MovieViewerRepositoryObjectNotFoundException $ex) {
        MovieViewerLogger::getLogger()->addError("トークンが見つからない", array("token" => $token_id));
        return plugin_movieviewer_reset_password_error("パスワードの再設定ができませんでした。");
    }
    try {
        $user = plugin_movieviewer_get_user_repository()->findById($token->user_id);
    } catch (MovieViewerRepositoryObjectNotFoundException $ex) {
        MovieViewerLogger::getLogger()->addError("ユーザが見つからない", array("token" => $token_id, "user" => $token->user_id));
        return plugin_movieviewer_reset_password_error("パスワードの再設定ができませんでした。");
    }
    $password = filter_input(INPUT_POST, 'movieviewer_password');
    $password_confirm = filter_input(INPUT_POST, 'movieviewer_password_confirm');
    if ($password !== $password_confirm) {
        $content = plugin_movieviewer_reset_password_action_confirm_generate_page($token, $user, "入力したパスワードとパスワード(確認)が一致しません。");
        return array("msg" => $page, "body" => $content);
    }
    $user->setPassword($password);
    plugin_movieviewer_get_user_repository()->store($user);
    plugin_movieviewer_get_user_reset_password_token_repository()->delete($token);
    $content = <<<TEXT
    パスワードを更新しました。
TEXT;
    return array("msg" => $page, "body" => $content);
}