import {
  SiLinkedin,
  SiMastodon,
  SiReddit,
  SiSinaweibo,
  SiTelegram,
  SiWhatsapp,
  SiX,
} from '@icons-pack/react-simple-icons';
import { camelCase, identity, pickBy } from 'lodash-es';
import qs from 'query-string';

const stringifyHashtags = (hashtags: string[], joinfix: string = ',', prefix?: string) => {
  // eslint-disable-next-line no-param-reassign
  if (prefix) hashtags = hashtags.map((tag) => prefix + camelCase(tag));
  return hashtags.filter(Boolean).join(joinfix);
};

export const useShare = ({
  url,
  title,
  desc,
  hashtags = [],
}: {
  desc: string;
  hashtags?: string[];
  title: string;
  url: string;
}) => {
  const genRedditLink = () => {
    const query = pickBy(
      {
        title: [
          [title, desc].filter(Boolean).join(' - '),
          hashtags && stringifyHashtags(hashtags, ' ', '#'),
        ]
          .filter(Boolean)
          .join(' '),
        url,
      },
      identity,
    ) as any;
    return qs.stringifyUrl({
      query,
      url: 'https://www.reddit.com/submit',
    });
  };

  const genTelegramLink = () => {
    const query = pickBy(
      {
        text: [
          [title, desc].filter(Boolean).join(' - '),
          hashtags && stringifyHashtags(hashtags, ' ', '#'),
        ]
          .filter(Boolean)
          .join(' '),
        url,
      },
      identity,
    ) as any;
    return qs.stringifyUrl({
      query,
      url: 'https://t.me/share/url"',
    });
  };

  const genWeiboLink = () => {
    const query = pickBy(
      {
        sharesource: 'weibo',
        title: [
          [title, desc].filter(Boolean).join(' - '),
          hashtags && stringifyHashtags(hashtags, ' ', '#'),
        ]
          .filter(Boolean)
          .join(' '),
        url,
      },
      identity,
    ) as any;
    return qs.stringifyUrl({
      query,
      url: 'http://service.weibo.com/share/share.php',
    });
  };

  const genWhatsappLink = () => {
    const query = pickBy(
      {
        text: [
          [title, desc].filter(Boolean).join(' - '),
          url,
          hashtags && stringifyHashtags(hashtags, ' ', '#'),
        ]
          .filter(Boolean)
          .join(' '),
      },
      identity,
    ) as any;
    return qs.stringifyUrl({
      query,
      url: 'https://api.whatsapp.com/send',
    });
  };

  const genXLink = () => {
    const query = pickBy(
      {
        hashtags: hashtags && stringifyHashtags(hashtags),
        text: [title, desc].filter(Boolean).join(' - '),
        url,
      },
      identity,
    ) as any;
    return qs.stringifyUrl({
      query,
      url: 'https://x.com/intent/tweet',
    });
  };

  const genLinkdinLink = () => {
    const query = pickBy(
      {
        url,
      },
      identity,
    ) as any;
    return qs.stringifyUrl({
      query,
      url: 'https://www.linkedin.com/sharing/share-offsite/',
    });
  };

  const genMastodonLink = () => {
    const query = pickBy(
      {
        text: [
          [title, desc].filter(Boolean).join(' - '),

          hashtags && stringifyHashtags(hashtags, ' ', '#'),
        ]
          .filter(Boolean)
          .join(' '),
        url,
      },
      identity,
    ) as any;
    return qs.stringifyUrl({
      query,
      url: 'https://mastodon.social/share',
    });
  };

  return {
    linkedin: {
      icon: SiLinkedin,
      link: genLinkdinLink(),
      title: 'Linkedin',
    },
    mastodon: {
      icon: SiMastodon,
      link: genMastodonLink(),
      title: 'Mastodon',
    },
    reddit: {
      icon: SiReddit,
      link: genRedditLink(),
      title: 'Reddit',
    },
    telegram: {
      icon: SiTelegram,
      link: genTelegramLink(),
      title: 'Telegram',
    },
    weibo: {
      icon: SiSinaweibo,
      link: genWeiboLink(),
      title: 'Weibo',
    },
    whatsapp: {
      icon: SiWhatsapp,
      link: genWhatsappLink(),
      title: 'WhatsApp',
    },
    x: {
      icon: SiX,
      link: genXLink(),
      title: 'X',
    },
  };
};
