import Tab from './containers/Tab';
import Tag from './containers/Tag';
import TabPane from './containers/TabPane';
import translations from './translations.yml';
import update from 'immutability-helper';
import ModTag from './containers/ModTag';
import ModActionButton from './containers/ModActionButton';
import ModSubscription from './containers/ModSubscription';
import ModIndicatorSubscription from './containers/ModIndicatorSubscription';
import FeaturedDialog from './containers/FeaturedDialog';
import { gql } from 'react-apollo';
import reducer from './reducer';

import { findCommentInEmbedQuery } from 'coral-embed-stream/src/graphql/utils';
import { prependNewNodes } from 'plugin-api/beta/client/utils';

export default {
  translations,
  reducer,
  slots: {
    streamTabsPrepend: [Tab],
    streamTabPanes: [TabPane],
    commentInfoBar: [Tag],
    moderationActions: [ModActionButton],
    adminModeration: [ModSubscription, FeaturedDialog],
    adminCommentInfoBar: [ModTag],
    adminModerationIndicator: [ModIndicatorSubscription],
  },
  mutations: {
    IgnoreUser: ({ variables }) => ({
      updateQueries: {
        CoralEmbedStream_Embed: previous => {
          if (!previous.asset.featuredComments) {
            return previous;
          }
          const ignoredUserId = variables.id;
          const newNodes = previous.asset.featuredComments.nodes.filter(
            n => n.user.id !== ignoredUserId
          );
          const removedCount =
            previous.asset.featuredComments.nodes.length - newNodes.length;
          const updated = update(previous, {
            asset: {
              featuredComments: {
                nodes: { $set: newNodes },
              },
              featuredCommentsCount: {
                $apply: value => value - removedCount,
              },
            },
          });
          return updated;
        },
      },
    }),
    AddTag: ({ variables }) => ({
      updateQueries: {
        CoralEmbedStream_Embed: previous => {
          let updated = previous;

          if (variables.name !== 'FEATURED') {
            return;
          }

          const comment = findCommentInEmbedQuery(previous, variables.id);

          if (previous.asset.comments) {
            updated = update(previous, {
              asset: {
                featuredComments: {
                  nodes: {
                    $apply: nodes => prependNewNodes(nodes, [comment]),
                  },
                },
                featuredCommentsCount: {
                  $apply: value => value + 1,
                },
              },
            });
          }

          return updated;
        },
      },
      update: proxy => {
        if (variables.name !== 'FEATURED') {
          return;
        }

        const fragmentId = `Comment_${variables.id}`;

        const fragment = gql`
          fragment Talk_FeaturedComments_addTag on Comment {
            status
          }
        `;

        const data = proxy.readFragment({ fragment, id: fragmentId });

        data.status = 'ACCEPTED';

        proxy.writeFragment({ fragment, id: fragmentId, data });
      },
    }),
    RemoveTag: ({ variables }) => ({
      updateQueries: {
        CoralEmbedStream_Embed: previous => {
          let updated = previous;

          if (variables.name !== 'FEATURED') {
            return;
          }

          if (previous.asset.comments) {
            updated = update(previous, {
              asset: {
                featuredComments: {
                  nodes: {
                    $apply: nodes => nodes.filter(n => n.id !== variables.id),
                  },
                },
                featuredCommentsCount: {
                  $apply: value => value - 1,
                },
              },
            });
          }

          return updated;
        },
      },
    }),
  },
};
