<?php

namespace App\Http\Controllers\CFP\GM;

use App\Models\Game\CF_MEMBER;
use App\Models\Game\CF_USER;
use App\Models\Web\CF_WEB_BADGE_INFO;
use App\Models\Web\CF_WEB_USER_BAN_INFO;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Validation\Rule;

class AccountsController extends Controller
{
    public function index (Request $request)
    {
        if (!$request->query("search", false))
        {
            $accounts = CF_MEMBER::with("user:USN")->paginate(10);
            return view("cfp.accChar.accounts")->withAccounts($accounts);
        }
        else
        {
            if (ctype_digit($request->query("search"))) {
                $accounts = CF_MEMBER::where("USN", $request->query("search"))
                    ->with("user:USN")->paginate(10);
                return view("cfp.accChar.accounts")->with(["accounts" => $accounts, "search" => true]);
            } else {
                $accounts = CF_MEMBER::where("USER_ID", "LIKE", "%{$request->query("search")}%")
                    ->with("user:USN")
                    ->paginate(10, ['*'], "pageSearch")
                    ->onEachSide(5)
                    ->appends("search", $request->query("search"));
                return view("cfp.accChar.accounts")->with(["accounts" => $accounts, "search" => true]);
            }
        }

        /*if ($request->isMethod("POST"))
        {
            $search = $request->input("search");
            if (ctype_digit($search)) {
                $accounts = CF_MEMBER::where("USN", $search)->paginate(10);
                return redirect()->route("cfp.accounts", ["search" => $search])->with(["accounts" => $accounts, "search" => true]);
            } else {
                $accounts = CF_MEMBER::where("USER_ID", "LIKE", "%{$search}%")
                    ->with("user:USN")
                    ->paginate(10, ['*'], "pageSearch")
                    ->onEachSide(5)
                    ->appends("search", $request->query("search"));
                return redirect()->route("cfp.accounts", ["search" => $search])->with(["accounts" => $accounts, "search" => true]);
            }
        }*/
    }

    public function view (Request $request, $usn)
    {
        try {
            $account = CF_MEMBER::where("USN", $usn)->with(["user" => function($query) {
                $query->with(["bills" => function($query) {
                    $query->orderBy("REG_DATE", "DESC")->limit(5);
                }]);
            }])->firstOrFail();
        } catch (ModelNotFoundException $e) {
            return view("cfp.errors.404");
        }

        $bans = CF_WEB_USER_BAN_INFO::where("USN", $account->USN)->latest("START_DATE")->paginate(10);
        $account->setRelation("bans", $bans);

        return view("cfp.accChar.accountView")->withAccount($account);
    }

    public function banOrBlock (Request $request, $type, $usn)
    {
        try {
            $user = CF_USER::where("USN", $usn)->with("member:USN,USER_ID")->firstOrFail();
        } catch (ModelNotFoundException $e) {
            return redirect()->route("cfp.accounts")->withError("O usuário não foi encontrado!");
        }

        switch ($type)
        {
            case "add": {
                return view("cfp.accChar.banBlock")->withUser($user);
            }
            case "remove": {
                $user->setRelation("bans", $user->bans()->with("issuer:USN,NICK")->paginate(10));
                return view("cfp.accChar.unbanUnblock")->withUser($user);
            }
            default: {
                return redirect()->route("cfp.accounts")->withError("Ação inválida!");
            }
        }
    }

    public function removePunishment (Request $request, $bid)
    {
        if (!$request->hasValidSignature()) {
            return redirect()->route("cfp.accounts")->withError("O token expirou, tente novamente.");
        }

        try {
            $banInfo = CF_WEB_USER_BAN_INFO::where("SRL", $bid)->firstOrFail();
        } catch (ModelNotFoundException $e) {
            return redirect()->route("cfp.accounts")->withError("Não encontramos o histórico da punição.");
        }
        return view("cfp.accChar.unbanUnblockConfirm")->withBan($banInfo);
    }

    public function doBanBlock (Request $request, $usn)
    {
        $messages = [
            "reason.required" => "Oops, o motivo do banimento é obrigatório.",
            "type.required" => "Oops, o tipo da punição é obrigatório.",
            "type.in" => "Oops, o tipo da punição é inválido, escolha uma opção da lista.",
            "proof.required" => "Oops, a URL do print é obrigatória.",
            "proof.url" => "Oops, a URL é inválida.",
            "time.required" => "Oops, o tempo da punição é obrigatório.",
            "time.integer" => "Oops, o tempo deve ser um número inteiro (0...N).",
            "time.min" => "Oops, o tempo deve ser no mínimo 0."
        ];
        \Validator::make($request->post(), [
            "reason" => "bail|required",
            "type" => ["required", Rule::in([0, 1, 2])],
            "proof" => "required|url",
            "time" => "required|integer|min:0"
        ], $messages)->validate();

        $reason = $request->post("reason");
        $type = $request->post("type");
        $time = $request->post("time");
        $proof = $request->post("proof");
        $result = \Helper::db_execStoredProcedure("cf_web", "WSP_USER_BAN", "?, ?, ?, ?, ?, ?, ?, ?", "@p_Result", [
            (int)$usn, $this->user_data->USN, (int)$type, 'A', $reason, (int)$time, $proof, null
        ]);
        switch($result)
        {
            case 1: {
                return redirect()->route("cfp.accounts")->withSuccess("Tudo certo, a punição foi aplicada " . ($time == 0 ? "permanentemente." : "por " . $time . "dia(s)."));
            }
            case -1: {
                return redirect()->route("cfp.accounts")->withError("O USN do usuário é inválido.");
            }
            case -2: {
                return redirect()->back()->withError("O tempo da punição (" . $time . ") é inválido.");
            }
            case -3: {
                return redirect()->back()->withError("Falha ao executar a punição, tente novamente.");
            }
            case -99:
            default: {
                return redirect()->route("cfp.accounts")->withError("Oops, erro desconhecido, entre em contato com um dev.");
            }
        }
    }

    public function doUnbanUnblock (Request $request, $bid)
    {
        try {
            $banInfo = CF_WEB_USER_BAN_INFO::where("SRL", $bid)->firstOrFail("USN");
        } catch (ModelNotFoundException $e) {
            return redirect()->route("cfp.accounts")->withError("Não encontramos o histórico da punição.");
        }
        $result = \Helper::db_execStoredProcedure("cf_web", "WSP_USER_BAN", "?, ?, ?, ?, ?, ?, ?, ?", "@p_Result", [
            $banInfo->USN, 0, 0, 'R', 'N/A', 0, 'N/A', $bid
        ]);
        switch($result)
        {
            case 1: {
                return redirect()->route("cfp.accounts.view", $banInfo->USN)->withSuccess("Tudo certo, a punição foi removida do jogador.");
            }
            case -1: {
                return redirect()->route("cfp.accounts")->withError("O USN do usuário é inválido.");
            }
            case -3: {
                return redirect()->back()->withError("Falha ao executar a punição, tente novamente.");
            }
            case -99:
            default: {
                return redirect()->route("cfp.accounts")->withError("Oops, erro desconhecido, entre em contato com um dev.");
            }
        }
    }

    public function doGetTitles (Request $request)
    {
        $titles = CF_WEB_BADGE_INFO::all();
        $titleArr = [];
        foreach ($titles as $title) {
            $titleArr[$title->ID] = $title->NAME;
        }
        return response()->json($titleArr);
    }
}
