<?php

namespace App\Modules\Admin\Notification;

use App\Models\AdminNotificationSetting;
use App\Models\NotificationType;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use App\Traits\ValidatorTraits;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class NotificationSettings
{

    use SortingTraits, SearchTraits, ValidatorTraits;
    public $adminID;

    public function __construct()
    {
        $this->adminID = Auth::user()->id;
    }

    public function fetchListOfSettings($payload)
    {
        // sorting
        $sortField = $this->sortField($payload, 'created_at'); // name = default column to search
        $sortOrder = $this->sortOrder($payload);

        $typeSearch = $this->searchField($payload->type);
        return NotificationType::select(
            'notification_types.id',
            'notification_types.type'
        )
            ->when(!empty($typeSearch), function ($query) use ($typeSearch) {
                return $query->where(function ($query) use ($typeSearch) {
                    $query->where('notification_types.type', 'LIKE', $typeSearch . '%');
                });
            })
            ->orderBy($sortField, $sortOrder)
            ->paginate(20);
    }

    public function fetchAccountSettings()
    {

        return AdminNotificationSetting::select(
            'conx_users_notification_settings.id as setting_id',
            'notification_types.type',
            'notification_types.id as notification_type_id',
        )
            ->leftJoin('notification_types', 'notification_types.id', 'conx_users_notification_settings.notification_type_id')
            ->where('admin_id', $this->adminID)
            ->get();
    }

    public function updateAccountNotificationSettings($payload, $notificationTypeID)
    {
        $status = $payload->status;

        // Validation
        $rules = array(
            'status' => 'required',
        );

        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        DB::beginTransaction();
        if ($status) {
            /* Enable notification */
            $data = [
                'admin_id' => $this->adminID,
                'notification_type_id' => $notificationTypeID,
            ];
            $notificationTransaction = AdminNotificationSetting::updateOrCreate($data, $data);
            if (!$notificationTransaction) {
                DB::rollback();
                return response()->json(['errors' => 'Something went wrong. Please reload the page']);
            } else {
                DB::commit();
                return response()->json(['success' => 'Notification successfully enabled']);
            }

        } else {
            /* Disable notification */

            $notificationTransaction = AdminNotificationSetting::where('notification_type_id', $notificationTypeID)
                ->where('admin_id', $this->adminID)
                ->delete();
            if (!$notificationTransaction) {
                DB::rollback();
                return response()->json(['errors' => 'Something went wrong. Please reload the page']);
            } else {
                DB::commit();
                return response()->json(['success' => 'Notification successfully disabled']);
            }

        }
    }
}
