<?php


namespace App\Http\Controllers\V1;


use App\Core\Service\ReputationManagementService;
use App\Exceptions\ApiErrorException;
use App\Http\Controllers\Controller;
use App\Jobs\PropertyReviewServiceJob;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Log;
use Exception;

class ReputationManagementController extends Controller
{

    private $params;
    private $reputationManagementService;


    public function __construct(
        ReputationManagementService $reputationManagementService
    )
    {
        $this->params = Input::all();
        $this->params = $this->params['params'];

        $this->reputationManagementService = $reputationManagementService;
    }


    public function getChannel(Request $request)
    {

        $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];

        try {

            $criteria = [
                'criteria' => [
                    ['field' => 'status', 'condition' => '=', 'value' => 1],
                ]
            ];

            $reputationManagementChannel = $this->reputationManagementService->selectChannel($criteria, ['id', 'name', 'logo', 'parameter', 'logo']);
            $reputationManagementChannel = $reputationManagementChannel['status'] == 'success' && !empty($reputationManagementChannel['data']) ? $reputationManagementChannel['data'] : [];


            $reputationManagementMappingCriteria = [
                'criteria' => [
                    ['field' => 'property_id', 'condition' => '=', 'value' => $this->params['property_id']],
                    ['field' => 'status', 'condition' => '=', 'value' => 1],
                ],
                'with' => ['fetchStatus'],
            ];

            $reputationManagementMapping = $this->reputationManagementService->selectChannelMapping($reputationManagementMappingCriteria);
            $reputationManagementMapping = $reputationManagementMapping['status'] == 'success' && !empty($reputationManagementMapping['data']) ? $reputationManagementMapping['data'] : [];
            $reputationManagementMappingCollect = collect($reputationManagementMapping);


            $reputationManagementList = [];
            foreach ($reputationManagementChannel as $reputationManagementChannelKey => $reputationManagementChannel) {

                $reputationManagementMapping = $reputationManagementMappingCollect->where('channel_id', $reputationManagementChannel['id'])->first();


                $reputationManagementDetail = null;
                $isSelected = $reputationManagementMapping ? true : false;

                if ($reputationManagementMapping) {
                    $reputationManagementDetail = [
                        'fetchStatus' => $reputationManagementMapping['fetch_status'],
                        'parameterArray' => $reputationManagementMapping['parameterArray']
                    ];
                }

                $reputationManagementList[] = [
                    //'code' => $webComponent['code'],
                    'id' => $reputationManagementChannel['id'],
                    'name' => $reputationManagementChannel['name'],
                    'logo' => $reputationManagementChannel['logo'],
                    'logoUrl' => $reputationManagementChannel['logoUrl'],
                    'parameterArray' => $reputationManagementChannel['parameterArray'],
                    'is_selected' => $isSelected,
                    'channelDetail' => $reputationManagementDetail
                ];

            }


            $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $reputationManagementList];

        } catch (ApiErrorException $e) {
            $response['message'] = implode(', ', $e->getMessageArr());
            $response['statusCode'] = 400;
        } catch (Exception $e) {
            $message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
            Log::error($message);
            $response['message'] = $e->getMessage();
            $response['statusCode'] = 500;
        }

        return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);

    }

    public function syncChannel(Request $request)
    {

        $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];

        try {


            $criteria = [
                'criteria' => [
                    ['field' => 'id', 'condition' => '=', 'value' => $this->params['channel_id']],
                    ['field' => 'status', 'condition' => '=', 'value' => 1],
                ],
                'firstRow' => true
            ];

            $reputationManagementChannel = $this->reputationManagementService->selectChannel($criteria, ['id', 'name', 'logo', 'parameter', 'logo']);
            $reputationManagementChannel = $reputationManagementChannel['status'] == 'success' && !empty($reputationManagementChannel['data']) ? $reputationManagementChannel['data'] : [];

            if (empty($reputationManagementChannel)) {
                throw new ApiErrorException(lang('Channel data not found'));
            }

            //Parameter Check
            if (!empty($this->params['channelDetail'])) {
                $parameterCheck = array_diff(array_keys($reputationManagementChannel['parameterArray']), array_keys($this->params['channelDetail']['parameter']));
                if (!empty($parameterCheck)) {
                    throw new ApiErrorException(lang('Missing or incorrect parameter'));
                }
            }


            $reputationManagementChannelMappingCriteria = [
                'criteria' => [
                    ['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($this->params, 'property_id')],
                    ['field' => 'channel_id', 'condition' => '=', 'value' => fillOnUndefined($this->params, 'channel_id')],
                    ['field' => 'status', 'condition' => '=', 'value' => 1],
                ],
                'firstRow' => true
            ];

            $reputationManagementChannelMapping = $this->reputationManagementService->selectChannelMapping($reputationManagementChannelMappingCriteria);
            $reputationManagementChannelMapping = $reputationManagementChannelMapping['status'] == 'success' && !empty($reputationManagementChannelMapping['data']) ? $reputationManagementChannelMapping['data'] : [];

            //Parameter Check


            DB::beginTransaction();

            if ($reputationManagementChannelMapping) {


                //Remove
                if (empty($this->params['channelDetail'])) {

                    $syncReputationManagementChannelMapping = $this->reputationManagementService->deleteChannelMapping($reputationManagementChannelMapping['id']);
                    if ($syncReputationManagementChannelMapping['status'] != 'success') {
                        throw new Exception('api-unknown_error');
                    }

                } else {

                    //Update
                    $updateParam = [
                        'property_id' => fillOnUndefined($this->params, 'property_id'),
                        'channel_id' => fillOnUndefined($this->params, 'channel_id'),
                        'parameter' => fillOnUndefined($this->params['channelDetail'], 'parameter') ? json_encode($this->params['channelDetail']['parameter']) : null,
                        'fetch_status' => fillOnUndefined($reputationManagementChannelMapping, 'fetch_status'),
                        'updated_by' => $request->auth->id,
                    ];

                    $syncReputationManagementChannelMapping = $this->reputationManagementService->updateChannelMapping($reputationManagementChannelMapping['id'], $updateParam);

                    if ($syncReputationManagementChannelMapping['status'] != 'success') {
                        throw new ApiErrorException($syncReputationManagementChannelMapping['message']);
                    }

                }

            } else {

                $createParam = [
                    'property_id' => fillOnUndefined($this->params, 'property_id'),
                    'channel_id' => fillOnUndefined($this->params, 'channel_id'),
                    'parameter' => fillOnUndefined($this->params['channelDetail'], 'parameter') ? json_encode($this->params['channelDetail']['parameter']) : null,
                    'fetch_status' => 3,
                    'status' => 1,
                    'created_by' => $request->auth->id,
                ];

                $syncReputationManagementChannelMapping = $this->reputationManagementService->createChannelMapping($createParam);

                if ($syncReputationManagementChannelMapping['status'] != 'success') {
                    throw new ApiErrorException($syncReputationManagementChannelMapping['message']);
                }

                //First Fetch Review
                dispatch(new PropertyReviewServiceJob($createParam['property_id'], $createParam['channel_id']));

            }


            $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => null];

        } catch (ApiErrorException $e) {
            $response['message'] = implode(', ', $e->getMessageArr());
            $response['statusCode'] = 400;
        } catch (Exception $e) {
            $message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
            Log::error($message);
            $response['message'] = $e->getMessage();
            $response['statusCode'] = 500;
        }

        if ($response['status']) {
            DB::commit();
        } else {
            DB::rollBack();
        }

        return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);

    }

    public function getReview(Request $request)
    {

        $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];

        try {


            $propertyReviewCriteria = [
                'criteria' => [
                    ['field' => 'property_id', 'condition' => '=', 'value' => $this->params['property_id']],
                    ['field' => 'status', 'condition' => '=', 'value' => 1],
                ],
                'with' => ['channel', 'channel', 'categoryMapping.category'],
                'orderBy' => [
                    ['field' => 'review_date', 'value' => 'DESC']
                ],
            ];


            if (isset($this->params['filter']) && !empty(isset($this->params['filter']))) {

                if (isset($this->params['filter']['channel_id'])) {
                    $propertyReviewCriteria['criteria'][] = ['field' => 'channel_id', 'condition' => '=', 'value' => $this->params['filter']['channel_id']];
                }

                if (isset($this->params['filter']['start_date'])) {
                    $propertyReviewCriteria['criteria'][] = ['field' => 'review_date', 'condition' => '>', 'value' => $this->params['filter']['start_date']];
                }

                if (isset($this->params['filter']['end_date'])) {
                    $propertyReviewCriteria['criteria'][] = ['field' => 'review_date', 'condition' => '<=', 'value' => $this->params['filter']['end_date']];
                }

                if (isset($this->params['filter']['sentiment'])) {
                    $propertyReviewCriteria['criteria'][] = ['field' => 'sentiment', 'condition' => '=', 'value' => $this->params['filter']['sentiment']];
                }


                if (isset($this->params['filter']['keyword'])) {
                    $propertyReviewCriteria['whereOr'][] = ['field' => 'author', 'condition' => 'LIKE', 'value' => '%' . $this->params['filter']['keyword'] . '%'];
                    $propertyReviewCriteria['whereOr'][] = ['field' => 'title', 'condition' => 'LIKE', 'value' => '%' . $this->params['filter']['keyword'] . '%'];
                    $propertyReviewCriteria['whereOr'][] = ['field' => 'review', 'condition' => 'LIKE', 'value' => '%' . $this->params['filter']['keyword'] . '%'];
                }


            }

            //Just Last 1 Year
            $propertyReviewCriteria['criteria'][] = ['field' => 'review_date', 'condition' => '>', 'value' => Carbon::now()->subYear()->toDateString()];


            $propertyReviewCriteriaCount = $propertyReviewCriteria;
            $propertyReviewCriteriaCount['count'] = true;
            $propertyReviewCount = $this->reputationManagementService->select($propertyReviewCriteriaCount, ['id']);


            $propertyReviewCriteria['skip'] = fillOnUndefined($this->params, 'page', 0) ? ($this->params['page'] - 1) : 0;
            $propertyReviewCriteria['take'] = fillOnUndefined($this->params, 'per_page', 20);
            $propertyReviewCriteria['skip'] = $propertyReviewCriteria['skip'] * $propertyReviewCriteria['take'];

            $column = ['id', 'property_id', 'channel_id', 'author', 'title', 'review', 'review_date', 'rating', 'top_rating', 'score', 'sentiment', 'language'];
            $propertyReview = $this->reputationManagementService->select($propertyReviewCriteria, $column);
            $propertyReview = $propertyReview['status'] == 'success' && !empty($propertyReview['data']) ? $propertyReview['data'] : [];


            $propertyReviewList = [
                'total' => $propertyReviewCount['data'],
                'page' => $this->params['page'],
                'count' => count($propertyReview),
                'review' => $propertyReview
            ];


            $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $propertyReviewList];

        } catch (ApiErrorException $e) {
            $response['message'] = implode(', ', $e->getMessageArr());
            $response['statusCode'] = 400;
        } catch (Exception $e) {
            $message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
            Log::error($message);
            $response['message'] = $e->getMessage();
            $response['statusCode'] = 500;
        }

        return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);

    }

    public function getReviewStatistics(Request $request)
    {

        $response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];

        try {


            $propertyReviewCriteria = [
                'criteria' => [
                    ['field' => 'property_id', 'condition' => '=', 'value' => $this->params['property_id']],
                    ['field' => 'status', 'condition' => '=', 'value' => 1],
                ],
                'with' => ['channel', 'channel', 'categoryMapping.category', 'keywordMapping'],
                'orderBy' => [
                    ['field' => 'review_date', 'value' => 'DESC']
                ],
            ];

            if (isset($this->params['filter']) && !empty(isset($this->params['filter']))) {

                if (isset($this->params['filter']['channel_id'])) {
                    $propertyReviewCriteria['criteria'][] = ['field' => 'channel_id', 'condition' => '=', 'value' => $this->params['filter']['channel_id']];
                }

                if (isset($this->params['filter']['start_date'])) {
                    $propertyReviewCriteria['criteria'][] = ['field' => 'review_date', 'condition' => '>', 'value' => $this->params['filter']['start_date']];
                }

                if (isset($this->params['filter']['end_date'])) {
                    $propertyReviewCriteria['criteria'][] = ['field' => 'review_date', 'condition' => '<=', 'value' => $this->params['filter']['end_date']];
                }

            }

            //Just Last 1 Year
            $propertyReviewCriteria['criteria'][] = ['field' => 'review_date', 'condition' => '>', 'value' => Carbon::now()->subYear()->toDateString()];


            $column = ['id', 'property_id', 'channel_id', 'review_date', 'rating', 'top_rating', 'score', 'sentiment', 'language'];
            $propertyReview = $this->reputationManagementService->select($propertyReviewCriteria, $column);
            $propertyReview = $propertyReview['status'] == 'success' && !empty($propertyReview['data']) ? $propertyReview['data'] : [];


            $propertyReviewStatistics['reviewScore'] = collect($propertyReview)->average('score');
            $propertyReviewStatistics['reviewScore'] = (float)number_format($propertyReviewStatistics['reviewScore'], 2, '.', '');


            $reviewSentimentGroup = collect($propertyReview)->groupBy('sentiment')->map->count();
            $reviewSentimentGroup = $reviewSentimentGroup ? $reviewSentimentGroup->toArray() : null;

            $reviewSentiment['positive'] = isset($reviewSentimentGroup[1]) ? $reviewSentimentGroup[1] : 0;
            $reviewSentiment['negative'] = isset($reviewSentimentGroup[0]) ? $reviewSentimentGroup[0] : 0;

            $propertyReviewStatistics['reviewScoreBySystem'] = null;
            if (($reviewSentiment['positive'] + $reviewSentiment['negative']) > 0) {
                $propertyReviewStatistics['reviewScoreBySystem'] = $reviewSentiment['positive'] / ($reviewSentiment['positive'] + $reviewSentiment['negative']) * 100;
                $propertyReviewStatistics['reviewScoreBySystem'] = (float)number_format($propertyReviewStatistics['reviewScoreBySystem'], 2, '.', '');
            }


            //$reviewCategoryScoreBySystem
            $reviewCategoryMapping = [];
            $reviewCategoryScoreBySystem = [];
            $reviewKeywordScoreBySystem = [];
            foreach ($propertyReview as $review) {

                foreach ($review['category_mapping'] as $reviewCategory) {
                    if (!isset($reviewCategoryScoreBySystem[$reviewCategory['category_id']])) {
                        $reviewCategoryScoreBySystem[$reviewCategory['category_id']][0] = 0;
                        $reviewCategoryScoreBySystem[$reviewCategory['category_id']][1] = 0;
                    }
                    $reviewCategoryScoreBySystem[$reviewCategory['category_id']][$reviewCategory['sentiment']]++;

                    $reviewCategoryMapping[$reviewCategory['category_id']]['name'] = $reviewCategory['category']['name'];
                    $reviewCategoryMapping[$reviewCategory['category_id']]['score'][$review['review_date']] = $review['score'];

                    if (!isset($reviewCategoryMapping[$reviewCategory['category_id']]['sentimentScore'][Carbon::parse($review['review_date'])->format('Y-m')])) {
                        $reviewCategoryMapping[$reviewCategory['category_id']]['sentimentScore'][Carbon::parse($review['review_date'])->format('Y-m')][0] = 0;
                        $reviewCategoryMapping[$reviewCategory['category_id']]['sentimentScore'][Carbon::parse($review['review_date'])->format('Y-m')][1] = 0;
                    }

                    $reviewCategoryMapping[$reviewCategory['category_id']]['sentimentScore'][Carbon::parse($review['review_date'])->format('Y-m')][$reviewCategory['sentiment']]++;

                }

                foreach ($review['keyword_mapping'] as $reviewKeyword) {
                    if (!isset($reviewKeywordScoreBySystem[md5($reviewKeyword['keyword'])])) {
                        $reviewKeywordScoreBySystem[md5($reviewKeyword['keyword'])]['positive'] = 0;
                        $reviewKeywordScoreBySystem[md5($reviewKeyword['keyword'])]['negative'] = 0;
                        $reviewKeywordScoreBySystem[md5($reviewKeyword['keyword'])]['keyword'] = $reviewKeyword['keyword'];
                    }

                    if ($reviewKeyword['sentiment'] == 1) {
                        $reviewKeywordScoreBySystem[md5($reviewKeyword['keyword'])]['positive']++;
                    } elseif ($reviewKeyword['sentiment'] == 0) {
                        $reviewKeywordScoreBySystem[md5($reviewKeyword['keyword'])]['negative']++;
                    }

                }
            }


            $propertyReviewCategoryCriteria = [
                'criteria' => [
                    ['field' => 'status', 'condition' => '=', 'value' => 1],
                ]
            ];

            $propertyReviewCategory = $this->reputationManagementService->selectCategory($propertyReviewCategoryCriteria);
            $propertyReviewCategory = $propertyReviewCategory['status'] == 'success' ? $propertyReviewCategory['data'] : [];

            $propertyReviewCategoryScore = [];
            foreach ($propertyReviewCategory as $reviewCategory) {
                if (empty($reviewCategoryScoreBySystem)) {
                    continue;
                }
                if (isset($reviewCategoryScoreBySystem[$reviewCategory['id']]) && array_sum($reviewCategoryScoreBySystem[$reviewCategory['id']]) < 5) {
                    continue;
                }
                $propertyReviewCategoryScore[$reviewCategory['id']] = [
                    'name' => $reviewCategory['name'],
                    'language_key' => $reviewCategory['language_key'],
                ];

                $propertyReviewCategoryScore[$reviewCategory['id']]['score'] = null;
                if (isset($reviewCategoryScoreBySystem[$reviewCategory['id']])) {

                    $propertyReviewCategoryScore[$reviewCategory['id']]['score'] = (float)number_format($reviewCategoryScoreBySystem[$reviewCategory['id']][1] / array_sum($reviewCategoryScoreBySystem[$reviewCategory['id']]) * 100, 2, '.', '');
                    $propertyReviewCategoryScore[$reviewCategory['id']]['positive'] = $reviewCategoryScoreBySystem[$reviewCategory['id']][1];
                    $propertyReviewCategoryScore[$reviewCategory['id']]['negative'] = $reviewCategoryScoreBySystem[$reviewCategory['id']][0];
                    $propertyReviewCategoryScore[$reviewCategory['id']]['total'] = array_sum($reviewCategoryScoreBySystem[$reviewCategory['id']]);


                    krsort($reviewCategoryMapping[$reviewCategory['id']]['score']);
                    $propertyReviewCategoryScore[$reviewCategory['id']]['scoreLastNumber'] = array_slice($reviewCategoryMapping[$reviewCategory['id']]['score'], 0, 10);

                    //Group By Month
                    /*$propertyReviewCategoryGroupScore = [];
                    foreach ($reviewCategoryMapping[$reviewCategory['id']]['score'] as $reviewDateTime => $reviewScore) {
                        $propertyReviewCategoryGroupScore[Carbon::parse($reviewDateTime)->format('m-Y')][] = $reviewScore;
                    }
                    $propertyReviewCategoryGroupScoreAverage = [];
                    foreach ($propertyReviewCategoryGroupScore as $reviewPeriod => $reviewPeriodScore) {
                        $propertyReviewCategoryGroupScoreAverage[$reviewPeriod] = round(collect($reviewPeriodScore)->avg());
                    }*/
                    //Group By Month


                    //Group By Month
                    ksort($reviewCategoryMapping[$reviewCategory['id']]['sentimentScore']);
                    $propertyReviewCategoryGroupScoreAverage = [];
                    foreach ($reviewCategoryMapping[$reviewCategory['id']]['sentimentScore'] as $reviewPeriod => $reviewPeriodScore) {
                        $categorySentimentScore = (float)number_format($reviewPeriodScore[1] / array_sum($reviewPeriodScore) * 100, 2, '.', '');
                        if ($categorySentimentScore <= 0) {
                            continue;
                        }
                        $propertyReviewCategoryGroupScoreAverage[$reviewPeriod] = round($categorySentimentScore);
                    }
                    //Group By Month

                    $propertyReviewCategoryScore[$reviewCategory['id']]['scoreMonthlyGroup'] = $propertyReviewCategoryGroupScoreAverage;
                    $propertyReviewCategoryScore[$reviewCategory['id']]['scoreMonthlyGroupAverage'] = (float)number_format(collect($propertyReviewCategoryGroupScoreAverage)->average(), 2, '.', '');

                }

            }
            $propertyReviewStatistics['reviewCategoryScoreBySystem'] = array_values($propertyReviewCategoryScore);
            //$reviewCategoryScoreBySystem


            foreach ($reviewKeywordScoreBySystem as $reviewKeywordKey => $reviewKeyword) {
                if (($reviewKeyword['positive'] + $reviewKeyword['negative']) < 3) {
                    unset($reviewKeywordScoreBySystem[$reviewKeywordKey]);
                    continue;
                }
                if (isset($reviewKeywordScoreBySystem[$reviewKeywordKey])) {
                    $reviewKeywordScoreBySystem[$reviewKeywordKey]['score'] = (float)number_format($reviewKeywordScoreBySystem[$reviewKeywordKey]['positive'] / array_sum($reviewKeywordScoreBySystem[$reviewKeywordKey]) * 100, 2, '.', '');
                }
            }

            $propertyReviewStatistics['reviewKeywordScoreBySystem'] = array_values($reviewKeywordScoreBySystem);


            //Dashboard Summary
            $propertyReviewStatistics['dashboard'] = [];
            $currentWeekStart = Carbon::now()->startOfWeek(Carbon::MONDAY)->toDateString();
            $currentWeekFinish = Carbon::now()->addWeek()->startOfWeek(Carbon::MONDAY)->toDateString();

            //TOTAL
            $totalReview = count($propertyReview);
            $extraReviewCount = collect($propertyReview)->where('review_date', '>', $currentWeekStart)->count();
            $propertyReviewStatistics['dashboard'] ['total'] = [
                'count' => $totalReview,
                'extraReviewCount' => $extraReviewCount
            ];

            //POSITIVE
            $totalReviewPositive = collect($propertyReview)->where('sentiment', 1)->count();
            $extraPositiveReviewCount = collect($propertyReview)->where('review_date', '>', $currentWeekStart)->where('sentiment', 1)->count();
            $propertyReviewStatistics['dashboard'] ['positive'] = [
                'count' => $totalReviewPositive,
                'extraReviewCount' => $extraPositiveReviewCount
            ];

            //NEGATIVE
            $totalReviewNegative = collect($propertyReview)->where('sentiment', '!=', 1)->count();
            $extraNegativeReviewCount = collect($propertyReview)->where('review_date', '>', $currentWeekStart)->where('sentiment', '!=', 1)->count();
            $propertyReviewStatistics['dashboard'] ['negative'] = [
                'count' => $totalReviewNegative,
                'extraReviewCount' => $extraNegativeReviewCount
            ];

            //BEST
            $bestReview = collect($propertyReviewCategoryScore)->sortByDesc('positive')->first();
            $propertyReviewStatistics['dashboard'] ['best'] = [
                'name' => $bestReview['name'],
                'language_key' => $bestReview['language_key'],
                'score' => $bestReview['score'],
                'positive' => $bestReview['positive'],
                'negative' => $bestReview['negative'],
                'total' => $bestReview['total'],
            ];


            $response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $propertyReviewStatistics];

        } catch (ApiErrorException $e) {
            $response['message'] = implode(', ', $e->getMessageArr());
            $response['statusCode'] = 400;
        } catch (Exception $e) {
            $message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
            Log::error($message);
            $response['message'] = $e->getMessage();
            $response['statusCode'] = 500;
        }

        return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);

    }


}

