import { TemplateFile } from '../../../types/types.js';

export const BookingRequest = {
  fileName: 'BookingRequest.java',
  folder: '/api/requests/',
  test: true,
  content: `package {{ groupId }}.api.requests;

import static {{ groupId }}.api.data.AuthRequestData.getTokenData;
import static io.github.boykaframework.actions.api.ApiActions.withRequest;
import static io.github.boykaframework.builders.ApiRequest.createRequest;
import static io.github.boykaframework.enums.RequestMethod.DELETE;
import static io.github.boykaframework.enums.RequestMethod.GET;
import static io.github.boykaframework.enums.RequestMethod.PATCH;
import static io.github.boykaframework.enums.RequestMethod.POST;
import static io.github.boykaframework.enums.RequestMethod.PUT;
import static java.text.MessageFormat.format;

import {{ groupId }}.api.pojo.BookingData;
import io.github.boykaframework.builders.ApiRequest;
import lombok.experimental.UtilityClass;

@UtilityClass
public final class BookingRequest {
    public static ApiRequest createBooking (final BookingData requestBody) {
        return createRequest ().method (POST)
            .header ("Accept", "application/json")
            .path ("/booking")
            .bodyObject (requestBody)
            .create ();
    }

    public static ApiRequest deleteBooking (final String id) {
        return createRequest ().method (DELETE)
            .header ("Content-Type", "application/json")
            .header ("Cookie", format ("token={0}", generateToken ()))
            .path ("/booking/$\{id}")
            .pathParam ("id", id)
            .create ();
    }

    public static ApiRequest getBooking (final String id) {
        return createRequest ().method (GET)
            .header ("Accept", "application/json")
            .path ("/booking/$\{id}")
            .pathParam ("id", id)
            .create ();
    }

    public static ApiRequest updateBooking (final String id, final BookingData requestBody) {
        return createRequest ().method (PUT)
            .header ("Accept", "application/json")
            .header ("Cookie", format ("token={0}", generateToken ()))
            .path ("/booking/$\{id}")
            .bodyObject (requestBody)
            .pathParam ("id", id)
            .create ();
    }

    public static ApiRequest updatePartialBooking (final String id, final BookingData requestBody) {
        return createRequest ().method (PATCH)
            .header ("Accept", "application/json")
            .header ("Cookie", format ("token={0}", generateToken ()))
            .path ("/booking/$\{id}")
            .bodyObject (requestBody)
            .pathParam ("id", id)
            .create ();
    }

    private static String generateToken () {
        final var generateTokenRequest = createRequest ().header ("Accept", "application/json")
            .method (POST)
            .path ("/auth")
            .bodyObject (getTokenData ())
            .create ();

        final var response = withRequest (generateTokenRequest)
            .execute ();
        return response.getResponseData ("token");
    }
}
`,
} satisfies TemplateFile;
