package org.initialde.yakasave.Api;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import org.initialde.yakasave.Api.Responses.RetrievedCollectiveSavingsFund;
import org.initialde.yakasave.Api.Responses.RetrievedPersonalSavingsFund;
import org.initialde.yakasave.Application.RetrieveOwnerSavingsFunds;
import org.initialde.yakasave.Domain.Enums.TypeSavingsFund;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/savings-fund")
public class RetrieveOwnerSavingsFundController {
    private final RetrieveOwnerSavingsFunds retrieveOwnerSavingsFund;

    @Autowired
    public RetrieveOwnerSavingsFundController(
            RetrieveOwnerSavingsFunds retrieveOwnerSavingsFund
    ) {
        this.retrieveOwnerSavingsFund = retrieveOwnerSavingsFund;
    }

    @Operation(summary = "Retrieve savings funds", description = "Returns either personal or collective savings funds based on the 'type' parameter")
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "Successfully retrieved savings funds", content = @Content(
                    mediaType = "application/json",
                    array = @ArraySchema(schema = @Schema(
                            oneOf = {RetrievedCollectiveSavingsFund.class, RetrievedPersonalSavingsFund.class}
                    ))
            ))
    })
    @GetMapping("")
    public List<? extends Record> retrieveAll(@RequestParam() String type) {
        return retrieveOwnerSavingsFund
                .retrieveAll(type)
                .stream()
                .map(s -> {
                    if (type.equals(TypeSavingsFund.COLLECTIVE.toString())) {
                        return RetrievedCollectiveSavingsFund.fromSavingsFunds(s);
                    }

                    return RetrievedPersonalSavingsFund.fromSavingsFunds(s);
                }).toList();
    }
}
