<?php

namespace App\Http\Controllers\Web\Client;

use App\Http\Controllers\Controller;
use App\Http\Requests\Web\Staking\StakingPurchaseRequest;
use App\Http\Requests\Web\Staking\StakingRedeemRequest;
use App\Http\Resources\Staking\Staking as StakingResource;
use App\Http\Resources\Staking\StakingCollection;
use App\Http\Resources\Staking\StakingUserCollection;
use App\Models\Staking\Staking;
use App\Models\Staking\StakingUser;
use App\Repositories\Staking\StakingRepository;
use App\Repositories\Staking\StakingUserRepository;
use App\Repositories\Wallet\WalletRepository;
use App\Services\Wallet\WalletService;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Inertia\Inertia;

class StakingController extends Controller
{

    public function index($sort = "all")
    {
        $stakings = [];

        if(auth()->user() && $sort == "my") {
            $stakings = new StakingUserCollection((new StakingUserRepository())->get(false, auth()->user()));
        } elseif($sort == "all") {
            $stakings = new StakingCollection((new StakingRepository())->get(false));
        }

        return Inertia::render('Staking/Stakings', [
            'stakings' => $stakings,
            'sort' => $sort
        ]);
    }


    public function show(Staking $staking)
    {
        $staking = (new StakingRepository())->getStakingById($staking->id);

        $walletRepository = new WalletRepository();

        $wallet = null;
        $balance = 0;

        if(auth()->user()) {
            $wallet = $walletRepository->getWalletByCurrency(auth()->user()->getAuthIdentifier(), $staking->currency_id, false);
            $balance = $wallet->balance_in_wallet;
        }

        if(!$staking) {
            throw new ModelNotFoundException();
        }

        return Inertia::render('Staking/Staking', [
            'staking' => new StakingResource($staking),
            'balance' => $balance
        ]);
    }

    public function submit(StakingPurchaseRequest $request) {

        $staking = Staking::where('id', $request->get('id'))->lockForUpdate()->first();

        $user = auth()->user();

        $wallet = (new WalletRepository())->getWalletByCurrency($user->id, $staking->currency->id, false);

        (new WalletService())->decrease($wallet, $request->get('amount'), 'wallet');

        $days = $request->get('days');
        $amount = $request->get('amount');

        $apy = get_apy_by_day($days, $staking->allowed_days, $staking->rewards_percentage);

        $valueDate = Carbon::now()->addDays(1);

        $stakingUser = new StakingUser();
        $stakingUser->user_id = $user->id;
        $stakingUser->staking_id = $staking->id;
        $stakingUser->currency_id = $staking->currency_id;
        $stakingUser->amount = $amount;
        $stakingUser->days = $days;
        $stakingUser->apy = $apy;
        $stakingUser->value_date = $valueDate->format('Y-m-d 00:00:00');
        $stakingUser->redemption_date = $valueDate->addDays((int)$days)->format('Y-m-d 00:00:00');
        $stakingUser->save();

        return response()->json(['success' => true]);

    }

    public function redeem(StakingRedeemRequest $request) {

        $staking = StakingUser::where('id', $request->get('id'))->with('currency')->lockForUpdate()->first();

        $user = auth()->user();

        $wallet = (new WalletRepository())->getWalletByCurrency($user->id, $staking->currency->id, false);
        (new WalletService())->increase($wallet, $staking->amount, 'wallet');

        $staking->status = "redeemed";
        $staking->save();

        return response()->json(['success' => true]);
    }

    public function redemptionCalculate(Request $request) {

        $date = Carbon::now()->addDays(1);

        return response()->json([
            'value_date' => $date->format('Y-m-d 00:00:00'),
            'redemption_date' => $date->addDays((int)$request->get('days'))->format('Y-m-d 00:00:00')
        ]);
    }
}
