import gql from "graphql-tag";

export const FETCH_PERSON = gql`
  query($username: String!) {
    fetchPerson(preferredUsername: $username) {
      id
      url
      name
      domain
      summary
      preferredUsername
      suspended
      mediaSize
      avatar {
        id
        name
        url
      }
      banner {
        id
        url
      }
      feedTokens {
        token
      }
      organizedEvents {
        total
        elements {
          id
          uuid
          title
          beginsOn
        }
      }
    }
  }
`;

export const GET_PERSON = gql`
  query(
    $actorId: ID!
    $organizedEventsPage: Int
    $organizedEventsLimit: Int
    $participationPage: Int
    $participationLimit: Int
  ) {
    person(id: $actorId) {
      id
      url
      name
      domain
      summary
      preferredUsername
      suspended
      mediaSize
      avatar {
        id
        name
        url
      }
      banner {
        id
        url
      }
      feedTokens {
        token
      }
      organizedEvents(
        page: $organizedEventsPage
        limit: $organizedEventsLimit
      ) {
        total
        elements {
          id
          uuid
          title
          beginsOn
        }
      }
      participations(page: $participationPage, limit: $participationLimit) {
        total
        elements {
          id
          event {
            id
            uuid
            title
            beginsOn
          }
        }
      }
      user {
        id
        email
      }
    }
  }
`;

export const LIST_PROFILES = gql`
  query ListProfiles(
    $preferredUsername: String
    $name: String
    $domain: String
    $local: Boolean
    $suspended: Boolean
    $page: Int
    $limit: Int
  ) {
    persons(
      preferredUsername: $preferredUsername
      name: $name
      domain: $domain
      local: $local
      suspended: $suspended
      page: $page
      limit: $limit
    ) {
      total
      elements {
        id
        preferredUsername
        domain
        name
        avatar {
          id
          url
        }
      }
    }
  }
`;

export const UPDATE_DEFAULT_ACTOR = gql`
  mutation ChangeDefaultActor($preferredUsername: String!) {
    changeDefaultActor(preferredUsername: $preferredUsername) {
      id
      defaultActor {
        id
      }
    }
  }
`;

export const CURRENT_ACTOR_CLIENT = gql`
  query currentActor {
    currentActor @client {
      id
      avatar {
        id
        url
      }
      preferredUsername
      name
    }
  }
`;

export const UPDATE_CURRENT_ACTOR_CLIENT = gql`
  mutation UpdateCurrentActor(
    $id: String!
    $avatar: String
    $preferredUsername: String!
    $name: String!
  ) {
    updateCurrentActor(
      id: $id
      avatar: $avatar
      preferredUsername: $preferredUsername
      name: $name
    ) @client
  }
`;

export const LOGGED_USER_PARTICIPATIONS = gql`
  query LoggedUserParticipations(
    $afterDateTime: DateTime
    $beforeDateTime: DateTime
    $page: Int
    $limit: Int
  ) {
    loggedUser {
      id
      participations(
        afterDatetime: $afterDateTime
        beforeDatetime: $beforeDateTime
        page: $page
        limit: $limit
      ) {
        total
        elements {
          event {
            id
            uuid
            title
            picture {
              id
              url
              alt
            }
            beginsOn
            visibility
            organizerActor {
              id
              preferredUsername
              name
              domain
              summary
              avatar {
                id
                url
              }
            }
            attributedTo {
              avatar {
                id
                url
              }
              preferredUsername
              name
              summary
              domain
              url
              id
            }
            participantStats {
              going
              notApproved
              participant
            }
            options {
              maximumAttendeeCapacity
              remainingAttendeeCapacity
            }
            tags {
              id
              slug
              title
            }
          }
          id
          role
          actor {
            id
            preferredUsername
            name
            domain
            summary
            avatar {
              id
              url
            }
          }
        }
      }
    }
  }
`;

export const LOGGED_USER_DRAFTS = gql`
  query LoggedUserDrafts($page: Int, $limit: Int) {
    loggedUser {
      id
      drafts(page: $page, limit: $limit) {
        id
        uuid
        title
        picture {
          id
          url
          alt
        }
        beginsOn
        visibility
        organizerActor {
          id
          preferredUsername
          name
          domain
          avatar {
            id
            url
          }
        }
        participantStats {
          going
          notApproved
        }
        options {
          maximumAttendeeCapacity
          remainingAttendeeCapacity
        }
      }
    }
  }
`;

export const LOGGED_USER_MEMBERSHIPS = gql`
  query LoggedUserMemberships($page: Int, $limit: Int) {
    loggedUser {
      id
      memberships(page: $page, limit: $limit) {
        total
        elements {
          id
          role
          actor {
            id
            avatar {
              id
              url
            }
            preferredUsername
            name
            domain
          }
          parent {
            id
            preferredUsername
            domain
            name
            type
            avatar {
              id
              url
            }
            organizedEvents {
              elements {
                id
                title
                picture {
                  id
                  url
                }
              }
              total
            }
          }
          invitedBy {
            id
            preferredUsername
            domain
            name
            avatar {
              id
              url
            }
          }
        }
      }
    }
  }
`;

export const IDENTITIES = gql`
  query {
    identities {
      id
      avatar {
        id
        url
      }
      type
      preferredUsername
      name
    }
  }
`;

export const PERSON_MEMBERSHIPS = gql`
  query PersonMemberships($id: ID!) {
    person(id: $id) {
      id
      memberships {
        total
        elements {
          id
          role
          parent {
            id
            preferredUsername
            name
            domain
            type
            avatar {
              id
              url
            }
          }
          invitedBy {
            id
            preferredUsername
            name
          }
          insertedAt
          updatedAt
        }
      }
    }
  }
`;

export const PERSON_MEMBERSHIP_GROUP = gql`
  query PersonMembershipGroup($id: ID!, $group: String!) {
    person(id: $id) {
      id
      memberships(group: $group) {
        total
        elements {
          id
          role
          parent {
            id
            preferredUsername
            name
            domain
            avatar {
              id
              url
            }
          }
          invitedBy {
            id
            preferredUsername
            name
          }
          insertedAt
          updatedAt
        }
      }
    }
  }
`;

export const GROUP_MEMBERSHIP_SUBSCRIPTION_CHANGED = gql`
  subscription($actorId: ID!, $group: String!) {
    groupMembershipChanged(personId: $actorId, group: $group) {
      id
      memberships {
        total
        elements {
          id
          role
          parent {
            id
            preferredUsername
            name
            domain
            avatar {
              id
              url
            }
          }
          invitedBy {
            id
            preferredUsername
            name
          }
          insertedAt
          updatedAt
        }
      }
    }
  }
`;

export const CREATE_PERSON = gql`
  mutation CreatePerson(
    $preferredUsername: String!
    $name: String!
    $summary: String
    $avatar: MediaInput
  ) {
    createPerson(
      preferredUsername: $preferredUsername
      name: $name
      summary: $summary
      avatar: $avatar
    ) {
      id
      preferredUsername
      name
      summary
      avatar {
        id
        url
      }
    }
  }
`;

export const UPDATE_PERSON = gql`
  mutation UpdatePerson(
    $id: ID!
    $name: String
    $summary: String
    $avatar: MediaInput
  ) {
    updatePerson(id: $id, name: $name, summary: $summary, avatar: $avatar) {
      id
      preferredUsername
      name
      summary
      avatar {
        id
        url
      }
    }
  }
`;

export const DELETE_PERSON = gql`
  mutation DeletePerson($id: ID!) {
    deletePerson(id: $id) {
      preferredUsername
    }
  }
`;

/**
 * This one is used only to register the first account.
 * Prefer CREATE_PERSON when creating another identity
 */
export const REGISTER_PERSON = gql`
  mutation(
    $preferredUsername: String!
    $name: String!
    $summary: String!
    $email: String!
  ) {
    registerPerson(
      preferredUsername: $preferredUsername
      name: $name
      summary: $summary
      email: $email
    ) {
      id
      preferredUsername
      name
      summary
      avatar {
        id
        url
      }
    }
  }
`;

export const SUSPEND_PROFILE = gql`
  mutation SuspendProfile($id: ID!) {
    suspendProfile(id: $id) {
      id
    }
  }
`;

export const UNSUSPEND_PROFILE = gql`
  mutation UnSuspendProfile($id: ID!) {
    unsuspendProfile(id: $id) {
      id
    }
  }
`;
