import { notifications } from "../../utils/chrome";
import { parseUri, queryCookies } from "../../utils/utils";
import { apiRequest } from "../../utils/api";
import { load } from "cheerio";

/**
 * 搜索店铺
 * 公共工具包与UI渲染和数据来源无关,供所有模块使用
 * @param shopName
 */
export function searchTaobaoShop(shopName: string) {
  chrome.tabs.query(
    { currentWindow: true, url: "https://shopsearch.taobao.com/*" },
    function (tabs) {
      if (tabs[0] && tabs[0].id) {
        chrome.tabs.update(tabs[0].id, {
          url: `https://shopsearch.taobao.com/search?q=${shopName}`,
          active: true,
        });
      } else {
        chrome.tabs.create({
          url: `https://shopsearch.taobao.com/search?q=${shopName}`,
          active: true,
        });
      }
    }
  );
}

export function generateSimilarShop() {
  chrome.tabs.query({ active: true }, function (tabs) {
    if (tabs[0]) {
      if (tabs[0].url?.indexOf("shopsearch.taobao.com") == -1) {
        notifications(
          "notintaobao",
          "当前页面不在淘宝店铺搜索页,无法获取相似店铺"
        );
        return;
      }
      if (tabs[0] && tabs[0].id) {
        chrome.tabs.sendMessage(tabs[0].id, { type: "generateSimilarShop" });
      }
    }
  });
}

/**
 * 获取淘宝cookie
 */
function queryTaobaoCookies() {
  return Promise.all([
    queryCookies({ domain: "shopsearch.taobao.com" }),
    queryCookies({ domain: "taobao.com" }),
  ])
    .then((results) => {
      const cookieResult = {
        cookieMap: {} as any,
        cookieStr: "",
      };
      results.forEach((item) => {
        cookieResult.cookieMap = {
          ...cookieResult.cookieMap,
          ...item.cookieMap,
        };
        cookieResult.cookieStr = cookieResult.cookieStr
          ? [cookieResult.cookieStr, item.cookieStr].join("; ")
          : item.cookieStr;
      });
      return cookieResult;
    })
    .catch((e) => {
      notifications(
        "apptip",
        "获取淘宝凭证失败,请在当前浏览器登录淘宝后再重试"
      );
      throw new Error(e);
    });
}

/**
 * 获取天猫cookie
 * @returns
 */
export function queryTianMaoCookies() {
  return queryCookies({ domain: ".tmall.com" }).catch((e) => {
    notifications("apptip", "获取天猫凭证失败,请在当前浏览器登录淘宝后再重试");
    throw new Error(e);
  });
}

export interface SearchShopParams {
  shopName: string;

  /**
   * 店铺类型 1 淘宝 2 天猫 3 全球购
   */
  type?: 1 | 2 | 3;

  /**
   * 店铺地址 多个地址逗号隔开,如北京,上海
   */
  location?: string;

  /**
   * 名称搜索类型
   * title 按照店铺名称搜索
   * wangwang 按照旺旺名称搜素
   */
  rele?: string;

  /**
   * 页数
   */
  pageNum?: number;

  /**
   * 好评率, 90%以上 -> 9000%,
   */
  goodrate?: string;

  /**
   * 淘宝店时区分
   * jin 金冠店，huang 皇冠店，zhuan 钻级店，xin 心级店
   */
  ratesum?: string;

  /**
   * 排序
   * default 排序类型 按销量降序,由大到小 sale-desc 按信用降序，由大到小 credit-desc
   */
  sort?: string;
}

export async function fetchShops(params: SearchShopParams) {
  const {
    shopName,
    type = "",
    location = "",
    rele = "",
    pageNum = 0,
    goodrate = "",
    ratesum = "",
    sort = "",
  } = params;
  const url = `https://shopsearch.taobao.com/search?q=${shopName}&isb=${type}&loc=${location}&rele_field=${rele}&sort=${sort}&s=${
    pageNum * 20
  }&goodrate=${goodrate}&ratesum=${ratesum}`;
  const result = await apiRequest({ url });
  const $ = load(result);
  const picsScript = $("script")[5];
  const contentStr = $(picsScript).text();
  // 去掉不需要的符号
  const content = contentStr.replace(/\s/g, "");
  const startIndex = content.indexOf("g_page_config");
  const endIndex = content.indexOf("g_srp_loadCss");
  const jsonStr = content.slice(
    startIndex + "g_page_config".length + 1,
    endIndex - 1
  );
  const pageConfigData = JSON.parse(jsonStr);
  return pageConfigData;
}

export interface SearchSimilarShopParams {
  similarUrl: string;
}
export async function fetchSimilarShop(params: SearchSimilarShopParams) {
  const { similarUrl } = params;
  const url = `https://shopsearch.taobao.com${similarUrl}`;
  const result = await apiRequest({ url });
  const $ = load(result);
  const picsScript = $("script")[5];
  const contentStr = $(picsScript).text();
  // 去掉不需要的符号
  const content = contentStr.replace(/\s/g, "");
  const startIndex = content.indexOf("g_page_config");
  const endIndex = content.indexOf("g_srp_loadCss");
  const jsonStr = content.slice(
    startIndex + "g_page_config".length + 1,
    endIndex - 1
  );
  const pageConfigData = JSON.parse(jsonStr);
  return pageConfigData;
}

export interface QueryWangLinkParams {
  shopUrl: string;
  shopName: string;
}
export async function fetchShopWangLink(params: QueryWangLinkParams) {
  const { shopUrl, shopName } = params;
  const cookieResult = await queryTaobaoCookies();
  const { cookieMap } = cookieResult;
  const { host, path } = parseUri(shopUrl);
  const url = `https://dispatch.taobao.com/getRealCid.aw?fromurl=${
    host + path
  }&t=${
    cookieMap.t
  }&toId=cntaobao${shopName}&charset=utf-8&clientX=181&clientY=81&fromId=cntaobao${
    cookieMap.lid
  }&encryptToUid=&bizType=&bizDomain=&pageSource=&appKey=&sceneParam=`;
  const result = await apiRequest<string>({ url });
  const shopUserNameDe = result.split("=")[1];
  const shopUserName = shopUserNameDe.slice(1, shopUserNameDe.length - 1);
  return `https://market.m.taobao.com/app/im/chat/index.html?&uid=${encodeURIComponent(
    shopUserName
  )}&gid=&type=web`;
}
