<?php

namespace App\Http\Controllers\Admin;

use App\Exports\FormResponsesExport;
use App\Http\Controllers\Controller;
use App\Libs\Services\AdminFormResponsesService;
use App\Libs\Services\BackendUserService;
use Illuminate\Http\Request;
use Spatie\Fractal\Facades\Fractal;
use Maatwebsite\Excel\Facades\Excel;
use App\Libs\Transformers\Form\FormResponsesTransformer;
use App\Models\Form;
use App\Models\FormResponse;

class AdminFormResponses extends Controller
{
    public function getIndex(Request $request, BackendUserService $backendUserService)
    {
        $loggedUser = $backendUserService->getLoggedUser();
        $formId = $request->input("formId");
        $formName = $request->input("formName");

        $forms = Form::full()
            ->where('status', 'published')
            ->get();

        $formsArray = [];
        foreach ($forms as $value) {
            $formsArray[$value->id] = $value->title;
        }

        return view('admin.pages.forms.form-responses', [
            'loggedUser'    => $loggedUser,
            'forms'         => $formsArray,
            'formId'        => $formId,
            'formName'      => $formName,
        ]);
    }

    public function postList(Request $request, AdminFormResponsesService $adminFormResponsesService)
    {
        $page = $request->input("current");
        $rowCount = $request->input("rowCount");
        $sort = $request->input("sort");
        $search = $request->input("searchPhrase");
        $form = $request->input("form");
        $formId = $request->input("formId");

        if (!empty($page)) {
            $result = $adminFormResponsesService->getFormResponsesList($page, $rowCount, $sort, $search, $form, $formId);
            $result["rows"] = Fractal::collection($result["rows"])
                ->transformWith(new FormResponsesTransformer())->toArray();
            return response()->json($result);
        } else {
            $forms = Form::all();
            return response()->json(Fractal::collection($forms)
                ->transformWith(new FormResponsesTransformer())->toArray());
        }
    }

    public function getView($formId = null)
    {
        if (!empty($formId)) {
            $form = FormResponse::find($formId);
        } else {
            abort(404);
        }

        if(empty($form)){
            abort(404);
        }

        return view('admin.pages.forms.form-responses-view', [
            'form'         => $form,
            'canView'        => true
        ]);
    }

    // public function getExportResponses(Request $request)
    // {
    //     $form = $request->input("form");
    //     $formId = $request->input("formId");

    //     return Excel::download(new FormResponsesExport($form, $formId), 'form_responses.xlsx');
    // }

    public function exportResponses(Request $request)
    {
        $formId = $request->input("formId");

        try {
            // Verify form exists
            $form = Form::findOrFail($formId);

            $fileName = 'form_responses_' . $form->id . '_' . date('Y_m_d_H_i_s') . '.xlsx';

            return Excel::download(new FormResponsesExport($formId), $fileName);

        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Export failed: ' . $e->getMessage()
            ], 400);
        }
    }

    public function postDelete(Request $request)
    {
        $id = $request->input("id");
        $formResponse = FormResponse::find($id);

        if(!empty($formResponse)){
            $formResponse->delete();
        }

        return response()->json(["success" => true]);
    }
}
