import gql from "graphql-tag";
import { DISCUSSION_BASIC_FIELDS_FRAGMENT } from "./discussion";
import { RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT } from "./resources";
import { POST_BASIC_FIELDS } from "./post";

export const LIST_GROUPS = gql`
  query ListGroups(
    $preferredUsername: String
    $name: String
    $domain: String
    $local: Boolean
    $suspended: Boolean
    $page: Int
    $limit: Int
  ) {
    groups(
      preferredUsername: $preferredUsername
      name: $name
      domain: $domain
      local: $local
      suspended: $suspended
      page: $page
      limit: $limit
    ) {
      elements {
        id
        url
        name
        domain
        summary
        preferredUsername
        suspended
        avatar {
          id
          url
        }
        banner {
          id
          url
        }
        organizedEvents {
          elements {
            id
            uuid
            title
            beginsOn
          }
          total
        }
      }
      total
    }
  }
`;

export const GROUP_FIELDS_FRAGMENTS = gql`
  fragment GroupFullFields on Group {
    id
    url
    name
    domain
    summary
    preferredUsername
    suspended
    visibility
    openness
    manuallyApprovesFollowers
    physicalAddress {
      description
      street
      locality
      postalCode
      region
      country
      geom
      type
      id
      originId
    }
    avatar {
      id
      url
      name
      metadata {
        width
        height
        blurhash
      }
    }
    banner {
      id
      url
      name
      metadata {
        width
        height
        blurhash
      }
    }
    organizedEvents(
      afterDatetime: $afterDateTime
      beforeDatetime: $beforeDateTime
      page: $organisedEventsPage
      limit: $organisedEventslimit
    ) {
      elements {
        id
        uuid
        title
        beginsOn
        draft
        options {
          maximumAttendeeCapacity
        }
        participantStats {
          participant
          notApproved
        }
        attributedTo {
          id
          preferredUsername
          name
          domain
        }
        organizerActor {
          id
          preferredUsername
          name
          domain
        }
      }
      total
    }
    discussions(page: $discussionsPage, limit: $discussionsLimit) {
      total
      elements {
        ...DiscussionBasicFields
      }
    }
    posts(page: $postsPage, limit: $postsLimit) {
      total
      elements {
        ...PostBasicFields
      }
    }
    members(page: $membersPage, limit: $membersLimit) {
      elements {
        id
        role
        actor {
          id
          name
          domain
          preferredUsername
          avatar {
            id
            url
          }
        }
        insertedAt
      }
      total
    }
    resources(page: 1, limit: 3) {
      elements {
        id
        title
        resourceUrl
        summary
        updatedAt
        type
        path
        metadata {
          ...ResourceMetadataBasicFields
        }
      }
      total
    }
    todoLists {
      elements {
        id
        title
        todos {
          elements {
            id
            title
            status
            dueDate
            assignedTo {
              id
              preferredUsername
            }
          }
          total
        }
      }
      total
    }
  }
`;

export const FETCH_GROUP = gql`
  query FetchGroup(
    $name: String!
    $afterDateTime: DateTime
    $beforeDateTime: DateTime
    $organisedEventsPage: Int
    $organisedEventslimit: Int
    $postsPage: Int
    $postsLimit: Int
    $membersPage: Int
    $membersLimit: Int
    $discussionsPage: Int
    $discussionsLimit: Int
  ) {
    group(preferredUsername: $name) {
      ...GroupFullFields
    }
  }
  ${GROUP_FIELDS_FRAGMENTS}
  ${DISCUSSION_BASIC_FIELDS_FRAGMENT}
  ${POST_BASIC_FIELDS}
  ${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
`;

export const GET_GROUP = gql`
  query GetGroup(
    $id: ID!
    $afterDateTime: DateTime
    $beforeDateTime: DateTime
    $organisedEventsPage: Int
    $organisedEventslimit: Int
    $postsPage: Int
    $postsLimit: Int
    $membersPage: Int
    $membersLimit: Int
    $discussionsPage: Int
    $discussionsLimit: Int
  ) {
    getGroup(id: $id) {
      mediaSize
      ...GroupFullFields
    }
  }
  ${GROUP_FIELDS_FRAGMENTS}
  ${DISCUSSION_BASIC_FIELDS_FRAGMENT}
  ${POST_BASIC_FIELDS}
  ${RESOURCE_METADATA_BASIC_FIELDS_FRAGMENT}
`;

export const CREATE_GROUP = gql`
  mutation CreateGroup(
    $preferredUsername: String!
    $name: String!
    $summary: String
    $avatar: MediaInput
    $banner: MediaInput
  ) {
    createGroup(
      preferredUsername: $preferredUsername
      name: $name
      summary: $summary
      banner: $banner
      avatar: $avatar
    ) {
      id
      preferredUsername
      name
      domain
      summary
      avatar {
        id
        url
      }
      banner {
        id
        url
      }
    }
  }
`;

export const UPDATE_GROUP = gql`
  mutation UpdateGroup(
    $id: ID!
    $name: String
    $summary: String
    $avatar: MediaInput
    $banner: MediaInput
    $visibility: GroupVisibility
    $openness: Openness
    $physicalAddress: AddressInput
    $manuallyApprovesFollowers: Boolean
  ) {
    updateGroup(
      id: $id
      name: $name
      summary: $summary
      banner: $banner
      avatar: $avatar
      visibility: $visibility
      openness: $openness
      physicalAddress: $physicalAddress
      manuallyApprovesFollowers: $manuallyApprovesFollowers
    ) {
      id
      preferredUsername
      name
      summary
      visibility
      openness
      manuallyApprovesFollowers
      avatar {
        id
        url
      }
      banner {
        id
        url
      }
    }
  }
`;

export const DELETE_GROUP = gql`
  mutation DeleteGroup($groupId: ID!) {
    deleteGroup(groupId: $groupId) {
      id
    }
  }
`;

export const LEAVE_GROUP = gql`
  mutation LeaveGroup($groupId: ID!) {
    leaveGroup(groupId: $groupId) {
      id
    }
  }
`;

export const REFRESH_PROFILE = gql`
  mutation RefreshProfile($actorId: ID!) {
    refreshProfile(id: $actorId) {
      id
    }
  }
`;

export const GROUP_TIMELINE = gql`
  query GroupTimeline(
    $preferredUsername: String!
    $type: ActivityType
    $author: ActivityAuthor
    $page: Int
    $limit: Int
  ) {
    group(preferredUsername: $preferredUsername) {
      id
      preferredUsername
      domain
      name
      activity(type: $type, author: $author, page: $page, limit: $limit) {
        total
        elements {
          id
          insertedAt
          subject
          subjectParams {
            key
            value
          }
          type
          author {
            id
            preferredUsername
            name
            domain
            avatar {
              id
              url
            }
          }
          group {
            id
            preferredUsername
          }
          object {
            ... on Event {
              id
              title
            }
            ... on Post {
              id
              title
            }
            ... on Member {
              id
              actor {
                id
                name
                preferredUsername
                domain
                avatar {
                  id
                  url
                }
              }
            }
            ... on Resource {
              id
              title
              path
              type
            }
            ... on Discussion {
              id
              title
              slug
            }
            ... on Comment {
              id
            }
            ... on Group {
              id
              preferredUsername
              domain
              name
              summary
              visibility
              openness
              physicalAddress {
                id
              }
              banner {
                id
              }
              avatar {
                id
              }
            }
          }
        }
      }
    }
  }
`;
