<?php

namespace App\Modules\Admin\Financials;

use App\Models\LoanBorrowList;
use App\Models\CompanySubscriptions;
use App\Http\Resources\Admin\Earnings as EarningsResource;
use App\Http\Resources\Admin\EarningsServiceFeeDetails as EarningsServiceFeeDetailsResource;
use App\Http\Resources\Admin\EarningsSubscriptionDetails as EarningsSubscriptionDetailsResource;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use Illuminate\Support\Facades\DB;

class Earnings
{
    use SortingTraits, SearchTraits;

    public function getData($payload)
    {
        // sorting
        $sortField = $this->sortField($payload, 'transaction_date'); // transaction_date = default column to search
        $sortOrder = $this->sortOrder($payload, 'desc');

        // searching
        $invoiceNoSearch = $this->searchField($payload->invoice_no);
        $companyNameSearch = $this->searchField($payload->company_name);
        $earningTypeSearch = $payload->earning_type;

        // advance search
        $monthSearch = $payload->month;
        if ($monthSearch == 0) {
            $monthSearch = '';
        }
        $yearSearch = $payload->year;

        $status = 'Approved';
        $subscriptions = CompanySubscriptions::select(
            'company_subscriptions.id',
            'company_subscriptions.created_at as transaction_date',
            'company_subscription_payments.invoice_no',
            'company_subscription_payments.amount_paid as rate',
            'company_subscription_payments.rate', // Made this redundant
            DB::raw('CONCAT("") as days'),
            DB::raw('CONCAT("") as other_expense'),
            DB::raw('CONCAT("Subscription") as earning_type2'),
            'companies.name as company_name')
            ->join('companies', 'companies.id', '=', 'company_subscriptions.company_id')
            ->join('company_subscription_payments', 'company_subscription_payments.company_subscription_id', '=', 'company_subscriptions.id')
            ->when(!empty($invoiceNoSearch), function ($query) use ($invoiceNoSearch) {
                return $query->where('company_subscription_payments.invoice_no', 'LIKE', $invoiceNoSearch . '%');
            })
            ->when(!empty($companyNameSearch), function ($query) use ($companyNameSearch) {
                return $query->where('companies.name', 'LIKE', $companyNameSearch . '%');
            })
            ->when(!empty($earningTypeSearch), function ($query) use ($earningTypeSearch) {
                return $query->whereIn(DB::raw('CONCAT("Subscription")'), $earningTypeSearch);
            })
            ->when(!empty($yearSearch), function ($query) use ($yearSearch) {
                return $query->whereYear('company_subscriptions.created_at', $yearSearch);
            })
            ->when(!empty($monthSearch), function ($query) use ($monthSearch) {
                return $query->whereMonth('company_subscriptions.created_at', $monthSearch);
            });
        return EarningsResource::collection(
            LoanBorrowList::select(
                'loan_borrow_lists.id',
                'loan_borrow_lists.updated_at as transaction_date',
                'loan_borrow_lists.invoice_no',
                'loan_borrow_lists.rate',
                'loan_borrow_lists.original_rate',
                'IBR.days',
                'IBR.other_expense',
                DB::raw('CONCAT("Service Fee") as earning_type'),
                'companies.name as company_name')
                ->join('inbound_billing_requests AS IBR', 'IBR.loan_borrow_lists_id', '=', 'loan_borrow_lists.id')
                ->join('workers', 'workers.id', '=', 'loan_borrow_lists.worker_id')
                ->join('companies', 'companies.id', '=', 'loan_borrow_lists.borrower_company_id')
                ->where('loan_borrow_lists.status', $status)
                ->union($subscriptions)
                ->when(!empty($invoiceNoSearch), function ($query) use ($invoiceNoSearch) {
                    return $query->where('loan_borrow_lists.invoice_no', 'LIKE', $invoiceNoSearch . '%');
                })
                ->when(!empty($companyNameSearch), function ($query) use ($companyNameSearch) {
                    return $query->where('companies.name', 'LIKE', $companyNameSearch . '%');
                })
                ->when(!empty($earningTypeSearch), function ($query) use ($earningTypeSearch) {
                    return $query->whereIn(DB::raw('CONCAT("Service Fee")'), $earningTypeSearch);
                })
                ->when(!empty($yearSearch), function ($query) use ($yearSearch) {
                    return $query->whereYear('IBR.cutoff_date', $yearSearch);
                })
                ->when(!empty($monthSearch), function ($query) use ($monthSearch) {
                    return $query->whereMonth('IBR.cutoff_date', $monthSearch);
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(10)
        )->response()->setStatusCode(201);
    }

    public function getDetails($payload, $id)
    {
        $earning_type = $payload->earning_type;
        if ($earning_type == 'Service Fee') {
            $status = 'Approved';
            return EarningsServiceFeeDetailsResource::collection(
                LoanBorrowList::select(
                    'loan_borrow_lists.id',
                    'loan_borrow_lists.updated_at as transaction_date',
                    'loan_borrow_lists.invoice_no',
                    'worker.worker_id',
                    'loan_borrow_lists.original_rate',
                    'loan_borrow_lists.rate',
                    'loan_borrow_lists.tax',
                    'loan_borrow_lists.date_from',
                    'loan_borrow_lists.date_to',
                    'IBR.days',
                    'IBR.other_expense',
                    'loaning_company.name',
                    'loaning_company.company_tel',
                    'loaning_company.email_address',
                    'loaning_company.street_address',
                    'loaning_company.city',
                    'loaning_company.state',
                    'loaning_company.zipcode')
                    ->join('inbound_billing_requests AS IBR', 'IBR.loan_borrow_lists_id', '=', 'loan_borrow_lists.id')
                    ->join('workers AS worker', 'worker.id', '=', 'loan_borrow_lists.worker_id')
                    ->join('companies AS loaning_company', 'loaning_company.id', '=', 'loan_borrow_lists.borrower_company_id')
                    ->where('loan_borrow_lists.id', $id)
                    ->where('loan_borrow_lists.status', $status)
                    ->limit(1)->get()
            )->response()->setStatusCode(201);
        } else {
            return EarningsSubscriptionDetailsResource::collection(
                CompanySubscriptions::select(
                    'company_subscriptions.id',
                    'company_subscriptions.created_at as transaction_date',
                    'company_subscription_payments.rate',
                    'company_subscription_payments.discount',
                    'company_subscription_payments.invoice_no',
                    'companies.name as company_name',
                    'companies.company_tel',
                    'companies.email_address',
                    'companies.street_address',
                    'companies.city',
                    'companies.state',
                    'companies.zipcode',
                    'company_subscription_rates.name as subscription_name')
                    ->join('companies', 'companies.id', '=', 'company_subscriptions.company_id')
                    ->join('company_subscription_payments', 'company_subscription_payments.company_subscription_id', '=', 'company_subscriptions.id')
                    ->join('company_subscription_rates', 'company_subscription_rates.id', '=', 'company_subscriptions.subscription_rate_id')
                    ->where('company_subscriptions.id', $id)
                    ->limit(1)->get()
            )->response()->setStatusCode(201);
        }
    }
}
