module Swagger
  module Schemas
    # Generic schema for an error response
    def self.Error
      {
        type: :object,
        properties: {
          errors: { type: :array, items: { type: :string } }
        },
        required: ['errors']
      }
    end

    # Generic schema for returning an ID
    def self.Id
      {
        type: :object,
        properties: {
          id: { type: :integer, description: 'Unique ID' }
        },
        required: ['id']
      }
    end

    # Board schema
    def self.Board
      {
        type: :object,
        properties: {
          id: { type: :integer, description: 'Unique ID for the board' },
          name: { type: :string, description: 'Name of the board' },
          slug: { type: :string, description: 'Slug of the board' },
          description: { type: [:string, :null], description: 'Description of the board' },
          created_at: { type: :string, description: 'Date and time when the board was created' },
          updated_at: { type: :string, description: 'Date and time when the board was last updated' }
        },
        required: %w[id name slug description created_at updated_at]
      }
    end

    # Comment schema
    def self.Comment
      {
        type: :object,
        properties: {
          id: { type: :integer, description: 'Unique ID for the comment' },
          body: { type: :string, description: 'Content of the comment' },
          post_id: { type: :integer, description: 'ID of the post the comment belongs to' },
          is_post_update: { type: :boolean, description: 'Whether the comment is a post update or not' },
          user: { '$ref' => '#/components/schemas/User' },
          created_at: { type: :string, description: 'Date and time when the comment was created' },
          updated_at: { type: :string, description: 'Date and time when the comment was last updated' }
        },
        required: %w[id body is_post_update post_id user created_at updated_at]
      }
    end

    # PostStatus schema
    def self.PostStatus
      {
        type: :object,
        properties: {
          id: { type: :integer, description: 'Unique ID for the post status' },
          name: { type: :string, description: 'Name of the post status' },
          color: { type: :string, description: 'Color of the post status' },
          show_in_roadmap: { type: :boolean, description: 'Whether the post status should be shown in the roadmap or not' },
          created_at: { type: :string, description: 'Date and time when the post status was created' },
          updated_at: { type: :string, description: 'Date and time when the post status was last updated' }
        },
        required: %w[id name color show_in_roadmap created_at updated_at]
      }
    end

    # User schema
    def self.User
      {
        type: :object,
        properties: {
          id: { type: :integer, description: 'Unique ID for the user' },
          email: { type: :string, description: 'Email of the user' },
          full_name: { type: :string, description: 'Full name of the user' },
          created_at: { type: :string, description: 'Date and time when the user was created' },
          updated_at: { type: :string, description: 'Date and time when the user was last updated' }
        },
        required: %w[id email full_name created_at updated_at]
      }
    end

    # Post schema
    def self.Post
      {
        type: :object,
        properties: {
          id: { type: :integer, description: 'Unique ID for the post' },
          title: { type: :string, description: 'Title of the post' },
          description: { type: :string, description: 'Content of the post' },
          board: { '$ref' => '#/components/schemas/Board' },
          post_status: { '$ref' => '#/components/schemas/PostStatus' },
          user: { '$ref' => '#/components/schemas/User' },
          approval_status: { type: :string, description: 'Approval status of the post (approved, pending or rejected)' },
          slug: { type: :string, description: 'Slug of the post' },
          created_at: { type: :string, description: 'Date and time when the post was created' },
          updated_at: { type: :string, description: 'Date and time when the post was last updated' }
        },
        required: %w[id title description board post_status user approval_status slug created_at updated_at]
      }
    end

    # Vote schema
    def self.Vote
      {
        type: :object,
        properties: {
          id: { type: :integer, description: 'Unique ID for the vote' },
          post_id: { type: :integer, description: 'ID of the post the vote belongs to' },
          user: { '$ref' => '#/components/schemas/User' },
          created_at: { type: :string, description: 'Date and time when the vote was created' },
          updated_at: { type: :string, description: 'Date and time when the vote was last updated' }
        },
        required: %w[id post_id user created_at updated_at]
      }
    end
  end
end