import { stringify } from 'querystring';

import FormData from 'form-data';
import camelcaseKey from 'camelcase-keys';
import snakecaseKey from 'snakecase-keys';
import { FieldResolver, mutationField, arg, intArg } from '@nexus/schema';

import { CONTENT_FORM_URLENCODED } from '../../constants';
import { errorHandler } from '../../helpers';
import { Context } from '../../types';

export let replyResolver: FieldResolver<'Mutation', 'reply'> = async (
  _,
  { replyInput, file, type, userId },
  context: Context,
) => {
  let replyInputSnake = snakecaseKey({ ...replyInput, archetype: 'regular' });
  const config = {
    headers: {
      'Content-Type': CONTENT_FORM_URLENCODED,
    },
  };

  try {
    if (file) {
      if (type === 'avatar' && !userId) {
        throw new Error('Upload avatar must include user id.');
      }
      const form = new FormData();
      let { createReadStream } = await file;
      let fileStream = createReadStream();
      form.append('files[]', fileStream);
      form.append('type', type);
      if (userId) {
        form.append('user_id', userId);
      }

      const config = {
        headers: {
          ...form.getHeaders(),
        },
      };
      let url = `/uploads.json`;
      let { data } = await context.client.post(url, form, config);
      let {
        originalFilename: name,
        width,
        height,
        shortUrl,
      } = camelcaseKey(data, { deep: true });
      let image = `![${name}|${width} x ${height}](${shortUrl})`;

      replyInputSnake.raw = image + '\n' + replyInputSnake.raw;
    }

    let { data } = await context.client.post(
      '/posts.json',
      stringify(replyInputSnake),
      config,
    );
    return camelcaseKey(data, { deep: true });
  } catch (e) {
    throw errorHandler(e);
  }
};

export let replyMutation = mutationField('reply', {
  type: 'Post',
  args: {
    replyInput: arg({ type: 'ReplyInput', required: true }),
    file: arg({ type: 'Upload' }),
    type: arg({ type: 'UploadTypeEnum' }),
    userId: intArg(),
  },
  resolve: replyResolver,
});