<?php

namespace App\Http\Controllers\Api\SchoolYears;

use App\Http\Controllers\Api\Core\BaseApiController;
use App\Http\Requests\SchoolYears\CloseSchoolYearRequest;
use App\Http\Requests\SchoolYears\PreviewCloseSchoolYearRequest;
use App\Http\Requests\SchoolYears\SaveSchoolYearRequest;
use App\Services\SchoolYears\SchoolYearClosureService;
use App\Services\SchoolYears\SchoolYearContextService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpFoundation\Response;

class SchoolYearController extends BaseApiController
{
    public function __construct(
        private SchoolYearClosureService $service,
        private SchoolYearContextService $context
    ) {
        parent::__construct();
    }

    public function index(Request $request): JsonResponse
    {
        $context = $this->context->options(
            $request->query('school_year'),
            $request->query('semester')
        );

        return response()->json([
            'ok' => true,
            'data' => $this->service->list(),
            'meta' => $context,
            'school_years' => $context['school_years'],
            'current_school_year' => $context['current_school_year'],
            'current_semester' => $context['current_semester'],
        ]);
    }

    public function current(Request $request): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'data' => $this->context->options(
                $request->query('school_year'),
                $request->query('semester')
            ),
        ]);
    }

    public function options(Request $request): JsonResponse
    {
        return $this->current($request);
    }

    public function store(SaveSchoolYearRequest $request): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'data' => $this->service->createYear($request->validated(), $this->getCurrentUserId()),
        ], Response::HTTP_CREATED);
    }

    public function update(SaveSchoolYearRequest $request, int $schoolYear): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'data' => $this->service->updateYear($schoolYear, $request->validated(), $this->getCurrentUserId()),
        ]);
    }

    public function summary(int $schoolYear): JsonResponse
    {
        return response()->json(['ok' => true, 'data' => $this->service->summary($schoolYear)]);
    }

    public function validateClose(PreviewCloseSchoolYearRequest $request, int $schoolYear): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'validation' => $this->service->validateClose($schoolYear, $request->validated()),
        ]);
    }

    public function previewClose(PreviewCloseSchoolYearRequest $request, int $schoolYear): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'data' => $this->service->previewClose($schoolYear, $request->validated()),
        ]);
    }

    public function close(CloseSchoolYearRequest $request, int $schoolYear): JsonResponse
    {
        try {
            $result = $this->service->close($schoolYear, $request->validated(), $this->getCurrentUserId());
        } catch (ValidationException $e) {
            throw $e;
        } catch (\Throwable $e) {
            return response()->json([
                'ok' => false,
                'message' => $e->getMessage(),
            ], Response::HTTP_CONFLICT);
        }

        return response()->json(['ok' => true, 'data' => $result]);
    }

    public function reopen(Request $request, int $schoolYear): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'data' => $this->service->reopen($schoolYear, $this->getCurrentUserId()),
        ]);
    }

    public function parentBalances(Request $request, int $schoolYear): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'data' => $this->service->parentBalances($schoolYear, $request->query('to_school_year')),
        ]);
    }

    public function promotionPreview(Request $request, int $schoolYear): JsonResponse
    {
        return response()->json([
            'ok' => true,
            'data' => $this->service->promotionPreview($schoolYear, $request->query('to_school_year')),
        ]);
    }
}
