<?php

namespace App\Libs\Services;

use App\Models\FormResponse;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;

class AdminFormResponsesService
{
    public function getFormResponsesList($page, $rowCount, $sort, $search, $form, $formId)
    {
        Paginator::currentPageResolver( function () use ($page) {
            return $page;
        });

        if (!empty($search)) {
            $query = FormResponse::where(function ($query) use ($search) {
                $query->orWhere('responses', 'like', "%{$search}%");
            });
        } else {
            $query = FormResponse::query();
        }

        // $formId = preset form from URL; $form = value picked in the dropdown filter
        if (!empty($form) && $form > 0) {
            $query->where('form_id', $form);
        } elseif (!empty($formId) && $formId > 0) {
            $query->where('form_id', $formId);
        }

        if (empty($sort)) {
            $rows = $query->paginate($rowCount);
        } else {
            foreach ($sort as $field => $direction) {
                if(empty($direction) || !Str::is(strtolower($direction),"desc")){
                    $orderDirection = "asc";
                } else {
                    $orderDirection = $direction;
                }
                $rows = $query->orderBy($field, strtolower($orderDirection))->paginate($rowCount);
                break;
            }
        }

        return [
            "total"             => $rows->total(),
            "current"           => $rows->currentPage(),
            "rowCount"          => $rowCount,
            "rows"              => $rows->getCollection()
        ];
    }

    public function list($data)
    {
        $query = FormResponse::full()
            ->with(['form']);

        $orderDir = $data['orderDir'] ? $data['orderDir'] : 'asc';

        if (!empty($data['formId'])) {
            $query->where('form_id', $data['formId']);
        }

        switch ($data['orderBy']) {
            default:
                # date
                $query->orderBy('created_at', $orderDir);
                break;
        }

        $perPage = $data['perPage'] ?? 12;
        $page = $data['page'] ?? 1;

        $formResponses = $query->paginate($perPage, ['*'], 'page', $page);

        $paginationData = [
            'currentPage' =>  intval($formResponses->currentPage()),
            'lastPage' => intval($formResponses->lastPage()),
            'perPage' =>  intval($formResponses->perPage()),
            'total' =>  intval($formResponses->total()),
            'count' =>  intval($formResponses->count()),
            'hasMorePages' => $formResponses->hasMorePages(),
            'nextPageUrl' => $formResponses->nextPageUrl(),
            'prevPageUrl' => $formResponses->previousPageUrl(),
        ];

        return [
            'formResponses' => $formResponses,
            'pagination' => $paginationData,
        ];
    }

    public function getFormResponse($formResponseId)
    {
        $formResponse = FormResponse::full()->with(['form'])
            ->where('id', $formResponseId)
            ->first();

        if (!$formResponse) {
            return null;
        }

        if (!is_array($formResponse->responses)) {
            $formResponse->responses = json_decode($formResponse->responses, true);
        }

        return $formResponse;
    }

    public function deleteFormResponse($formResponseId)
    {
        $formResponse = FormResponse::find($formResponseId);

        if (!$formResponse) {
            return [
                'success' => false,
                'message' => 'Form response not found',
            ];
        }

        try {
            $formResponse->delete();

            return [
                'success' => true,
                'message' => 'Form response deleted successfully',
            ];
        } catch (\Exception $e) {
            Log::error('Failed to delete form response', [
                'form_response_id' => $formResponseId,
                'error' => $e->getMessage(),
            ]);

            return [
                'success' => false,
                'message' => 'Failed to delete form response',
            ];
        }
    }
}
