<?php

namespace App\Modules\Admin\Subscriptions;

use App\Models\CompanySubscriptionRates;
use App\Http\Resources\Admin\SubscriptionRate as SubscriptionRateResource;
use App\Http\Resources\Admin\SubscriptionRateDetails as SubscriptionRateDetailsResource;

class CompanySubscriptionRateModule
{
    public function getData($payload)
    {
        //! Sorting
        $sortField = $payload['sortField'] ?? 'name';
        $sortOrder = $payload['sortOrder'] ?? 'asc';

        //! Searching
        $nameSearch   = $payload['name'] ?? null;
        $statusSearch = $payload['is_disabled'] ?? false;

        return SubscriptionRateResource::collection(
            CompanySubscriptionRates::select(
                'company_subscription_rates.id',
                'company_subscription_rates.name',
                'company_subscription_rates.description',
                'company_subscription_rates.monthly_rate',
                'company_subscription_rates.yearly_rate',
                'company_subscription_rates.max_employee',
                'company_subscription_rates.is_unlimited',
                'company_subscription_rates.is_disabled'
                )
                ->when(
                    !empty($nameSearch), 
                    function ($query) use ($nameSearch) 
                    {
                        return $query->where(function ($query) use ($nameSearch) 
                            {
                                $query->where('company_subscription_rates.name', 'LIKE', $nameSearch . '%');
                            }
                        );
                    }
                )
                ->when(
                    !empty($statusSearch), 
                    function ($query) use ($statusSearch) 
                    {
                        return $query->where(
                        function ($query) use ($statusSearch) 
                        {
                            $query->whereIn('company_subscription_rates.is_disabled', $statusSearch);
                        }
                    );
                    }
                )
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )
        ->response()
        ->setStatusCode(200);
    }

    public function getDetails($id)
    {
        return SubscriptionRateDetailsResource::collection(
            CompanySubscriptionRates::select(
                'company_subscription_rates.id',
                'company_subscription_rates.name',
                'company_subscription_rates.description',
                'company_subscription_rates.monthly_rate',
                'company_subscription_rates.yearly_rate',
                'company_subscription_rates.max_employee',
                'company_subscription_rates.is_unlimited'
                )
                ->where('company_subscription_rates.id', $id)
                ->limit(1)
                ->get()
        )
        ->response()
        ->setStatusCode(200);
    }

    public function storeData($payload)
    {
        $subscription_rate_data =
        [
            'name'         => $payload['name'],
            'description'  => $payload['description'],
            'monthly_rate' => $payload['monthly_rate'],
            'yearly_rate'  => $payload['yearly_rate'],
            'max_employee' => $payload['max_employee'] ?? null,
            'is_unlimited' => isset($payload['max_employee']) ? 0 : 1,
        ];

        // save subscription rate data to subscription_rates table
        CompanySubscriptionRates::create($subscription_rate_data);

        return response()
            ->json(
                [
                        'success' => 'Data added successfully.'
                    ]
                )
            ->setStatusCode(201);
    }

    public function updateData($payload, $id)
    {    
        $subscription_rate_data = 
        [
            'name'         => $payload['name'],
            'description'  => $payload['description'],
            'monthly_rate' => $payload['monthly_rate'],
            'yearly_rate'  => $payload['yearly_rate'],
            'max_employee' => $payload['max_employee'] ?? null,
            'is_unlimited' => isset($payload['max_employee']) ? 0 : 1,
        ];

        CompanySubscriptionRates::whereId($id)->update($subscription_rate_data);
            return response()
            ->json(
                [
                    'success' => 'Data updated successfully.'
                ]
            )
            ->setStatusCode(200);
    }

    public function enableDisableData($payload, $id)
    {
        $subscription_rate_data = 
        [
            'is_disabled' => $payload['is_disabled'],
        ];

        CompanySubscriptionRates::whereId($id)
            ->update($subscription_rate_data);

        return response()->json(['success' => 'Data updated successfully.'])->setStatusCode(200);
    }

    public function mixinCompanySubscriptionRate()
    {
        return CompanySubscriptionRates::select(
            'company_subscription_rates.id',
            'company_subscription_rates.name',
            'company_subscription_rates.description',
            'company_subscription_rates.monthly_rate',
            'company_subscription_rates.yearly_rate',
            'company_subscription_rates.max_employee',
            'company_subscription_rates.is_unlimited'
        )
        ->where('company_subscription_rates.is_disabled', false)
        ->get();
    }
}
