import axios from 'axios';
import { load } from 'cheerio';
import { getVarFromScript } from './utils';
import { v4 as uuidv4 } from 'uuid';

const userAgent =
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36';

/**
 * 获取musicens列表
 * @param name
 * @returns
 */
export async function scrapyMusicListFromMusicenc(name) {
  const res = await axios.get(`https://www.musicenc.com/?search=${name}`, {
    headers: {
      'User-Agent': userAgent,
    },
  });
  const $ = load(res.data);
  const musicList = [];
  const uniqueMap = {};
  $('.list>li').map(function () {
    if (musicList.length > 5) {
      return;
    }
    const authorTxt = $(this).children('span').text() || '';
    const name = $(this).children('a').text() || '';
    const token = $(this).children('a').attr('dates');
    const uuid = uuidv4().replaceAll('-', '');
    const author = authorTxt.slice(1, authorTxt.length - 2);
    const uniqueId = name + author;
    if (uniqueMap[uniqueId]) {
      return;
    }
    uniqueMap[uniqueId] = true;
    if (author && name) {
      musicList.push({
        id: uuid,
        author,
        name: name.toLowerCase(),
        token,
        type: 0,
      });
    }
  });
  const musicReqPromises = [];
  for (let i = 0; i < musicList.length; i++) {
    const item = musicList[i];
    musicReqPromises.push(
      axios
        .get(`https://www.musicenc.com/searchr/?token=${item.token}`, {
          headers: {
            'User-Agent': userAgent,
          },
        })
        .then((res) => res.data),
    );
  }
  const contents = await Promise.all(musicReqPromises);
  for (let i = 0; i < contents.length; i++) {
    const $ = load(contents[i]);
    const bidHref = $('.downBu.secm3').attr('href') || '';
    const bid = bidHref.slice(
      bidHref.lastIndexOf('/') + 1,
      bidHref.lastIndexOf('.'),
    );
    musicList[i].bid = bid;
  }
  return musicList;
}

/**
 * 获取musicens音乐链接
 * @param bid
 * @returns
 */
export async function scrapyMusicLinkFromMusicenc(bid) {
  const res = await axios.get(`https://www.musicenc.com/article/${bid}.html`, {
    headers: {
      'User-Agent': userAgent,
    },
  });
  const $ = load(res.data);
  const picsScript = $('script')[4];
  const link = atob(getVarFromScript($(picsScript).text(), 'pics'));
  return axios.get(link).then((res) => res.data);
}

const TonzhonSearchLink = {
  1: 'https://music-api.tonzhon.com/search/m/',
  2: 'https://music-api.tonzhon.com/search/n/',
  3: 'https://music-api.tonzhon.com/search/q/',
  4: 'https://music-api.tonzhon.com/search/k/',
};

/**
 * 获取铜钟列表
 * @param name
 * @param source
 * @returns
 */
export async function scrapyMusicListFromTonzhon(name, source) {
  const res = await axios.get(`${TonzhonSearchLink[source]}${name}`, {
    headers: {
      'User-Agent': userAgent,
    },
  });
  const data = res.data.data || [];
  const songs = data.songs || [];
  const result = [];
  songs.map((item) => {
    const uuid = uuidv4().replaceAll('-', '');
    const articles = item.artists || [];
    const author = (articles[0] && articles[0].name) || item.alias;
    // 只有作者和歌曲名同时在才需要
    if (author && item.name) {
      result.push({
        id: uuid,
        author,
        name: item.name.toLowerCase(),
        bid: item.newId,
        type: source,
      });
    }
  });
  return result;
}

/**
 * 获取铜钟音乐
 * @param bid
 * @returns
 */
export async function scrapyMusicLinkFromTonzhon(bid) {
  const res = await axios.get(
    `https://music-api.tonzhon.com/song_file/${bid}`,
    {
      headers: {
        'User-Agent': userAgent,
      },
    },
  );
  const data = res.data;
  return data.data;
}
