# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.ApiSpec.PleromaReportOperation do
  alias OpenApiSpex.Operation
  alias OpenApiSpex.Schema
  alias Pleroma.Web.ApiSpec.Admin.ReportOperation
  alias Pleroma.Web.ApiSpec.Schemas.Account
  alias Pleroma.Web.ApiSpec.Schemas.ApiError
  alias Pleroma.Web.ApiSpec.Schemas.FlakeID
  alias Pleroma.Web.ApiSpec.Schemas.Status

  def open_api_operation(action) do
    operation = String.to_existing_atom("#{action}_operation")
    apply(__MODULE__, operation, [])
  end

  def index_operation do
    %Operation{
      tags: ["Reports"],
      summary: "Get a list of your own reports",
      operationId: "PleromaAPI.ReportController.index",
      security: [%{"oAuth" => ["read:reports"]}],
      parameters: [
        Operation.parameter(
          :state,
          :query,
          ReportOperation.report_state(),
          "Filter by report state"
        ),
        Operation.parameter(
          :limit,
          :query,
          %Schema{type: :integer},
          "The number of records to retrieve"
        ),
        Operation.parameter(
          :page,
          :query,
          %Schema{type: :integer, default: 1},
          "Page number"
        ),
        Operation.parameter(
          :page_size,
          :query,
          %Schema{type: :integer, default: 50},
          "Number number of log entries per page"
        )
      ],
      responses: %{
        200 =>
          Operation.response("Response", "application/json", %Schema{
            type: :object,
            properties: %{
              total: %Schema{type: :integer},
              reports: %Schema{
                type: :array,
                items: report()
              }
            }
          }),
        404 => Operation.response("Not Found", "application/json", ApiError)
      }
    }
  end

  def show_operation do
    %Operation{
      tags: ["Reports"],
      summary: "Get an individual report",
      operationId: "PleromaAPI.ReportController.show",
      parameters: [ReportOperation.id_param()],
      security: [%{"oAuth" => ["read:reports"]}],
      responses: %{
        200 => Operation.response("Report", "application/json", report()),
        404 => Operation.response("Not Found", "application/json", ApiError)
      }
    }
  end

  # Copied from ReportOperation.report with removing notes
  defp report do
    %Schema{
      type: :object,
      properties: %{
        id: FlakeID,
        state: ReportOperation.report_state(),
        account: Account,
        actor: Account,
        content: %Schema{type: :string},
        created_at: %Schema{type: :string, format: :"date-time"},
        statuses: %Schema{type: :array, items: Status}
      }
    }
  end
end
