<?php

namespace App\Repositories\Transaction;

use App\Models\Order\FuturesContract;
use App\Models\Transaction\Transaction;
use App\Models\User\User;
use Illuminate\Support\Facades\DB;

class FuturesTransactionRepository
{
    public function count() {

        $transaction = FuturesContract::query();

        return $transaction->count();
    }

    public function getReport() {

        $transaction = FuturesContract::query();

        $transaction->filterUser(request()->only(['market', 'type']))->orderByLatest();

        $transaction->has('market')->has('user');

        $transaction->with(['market.quoteCurrency', 'market.baseCurrency']);

        return $transaction->paginate(50)->withQueryString();
    }

    public function getReportUser(User $user, $limit = 15, $start = false, $end = false, $paginate = false) {

        $transaction = FuturesContract::query();

        $transaction->filterUser(request()->only(['market', 'type']))->orderByLatest();

        $transaction->has('market')->has('user');

        $transaction->with(['market.quoteCurrency', 'market.baseCurrency']);

        if($start && $end) {
            $transaction->whereBetween('created_at', [$start, $end]);
        }

        $transaction->where('status', '<>','active');

        $transaction->where('user_id', $user->id);

        if($paginate) {
            return $transaction->simplePaginate($limit);
        }

        return $transaction->paginate(50)->withQueryString();
    }

    public function getStatReport($period) {
        return DB::table('futures_contract')
            ->selectRaw('markets.name as pair, currencies.symbol, SUM(futures_contract.balance - futures_contract.released_amount) as income, COUNT(*) as total')
            ->join('currencies', 'currencies.id', 'futures_contract.quote_currency_id')
            ->join('markets', 'markets.id', 'futures_contract.market_id')
            ->where('futures_contract.status', '!=', 'active')
            ->whereBetween('futures_contract.created_at', $period)
            ->groupByRaw('markets.name, currencies.symbol')->get();
    }
}
