import baseRequest from "./baseRequest";
import Toast from "react-native-toast-message";
import { generateSignature } from "./crypto";

export async function follow(follower, followed) {
  const apiUrl = process.env.EXPO_PUBLIC_API_URL;

  try {
    const base = await baseRequest();
    const signature = await generateSignature({
      account_relations: [
        { sub_mid: follower, obj_mid: followed, predicate: 0 },
        { sub_mid: followed, obj_mid: follower, predicate: 1 },
      ],
      ...base,
    });
    const response = await fetch(
      `${apiUrl}/api/account_relation/create?signature=${signature}`,
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          account_relations: [
            { sub_mid: follower, obj_mid: followed, predicate: 0 },
            { sub_mid: followed, obj_mid: follower, predicate: 1 },
          ],
          ...base,
        }),
      }
    );
    const data = await response.json();
    if (data.ret === -1) {
      Toast.show({
        type: "error",
        text1: data.msg,
        topOffset: 60,
      });
      return;
    }
  } catch (error) {
    console.error(error);
  }
}

export async function unfollow(unfollower, unfollowed) {
  const apiUrl = process.env.EXPO_PUBLIC_API_URL;

  try {
    const base = await baseRequest();
    const signature = await generateSignature({
      sentences: [
        { sub_mid: unfollower, obj_mid: unfollowed, predicate: 0 },
        { sub_mid: unfollowed, obj_mid: unfollower, predicate: 1 },
      ],
      ...base,
    });
    const response = await fetch(
      `${apiUrl}/api/account_relation/delete?signature=${signature}`,
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          sentences: [
            { sub_mid: unfollower, obj_mid: unfollowed, predicate: 0 },
            { sub_mid: unfollowed, obj_mid: unfollower, predicate: 1 },
          ],
          ...base,
        }),
      }
    );
    const data = await response.json();
    if (data.ret === -1) {
      Toast.show({
        type: "error",
        text1: data.msg,
        topOffset: 60,
      });
      return;
    }
  } catch (error) {
    console.error(error);
  }
}

export async function block(blocker, blocked) {
  const apiUrl = process.env.EXPO_PUBLIC_API_URL;

  try {
    const base = await baseRequest();
    const signature = await generateSignature({
      account_relations: [
        { sub_mid: blocker, obj_mid: blocked, predicate: 2 },
        { sub_mid: blocked, obj_mid: blocker, predicate: 3 },
      ],
      ...base,
    });
    const response = await fetch(
      `${apiUrl}/api/account_relation/create?signature=${signature}`,
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          account_relations: [
            { sub_mid: blocker, obj_mid: blocked, predicate: 2 },
            { sub_mid: blocked, obj_mid: blocker, predicate: 3 },
          ],
          ...base,
        }),
      }
    );
    const data = await response.json();
    if (data.ret === -1) {
      Toast.show({
        type: "error",
        text1: data.msg,
        topOffset: 60,
      });
      return;
    }
    Toast.show({
      type: "success",
      text1: "拉黑成功，将不再向您推荐Ta",
      topOffset: 60,
    });
  } catch (error) {
    console.error(error);
  }
}

export async function unblock(unblocker, unblocked) {
  const apiUrl = process.env.EXPO_PUBLIC_API_URL;

  try {
    const base = await baseRequest();
    const signature = await generateSignature({
      sentences: [
        { sub_mid: unblocker, obj_mid: unblocked, predicate: 2 },
        { sub_mid: unblocked, obj_mid: unblocker, predicate: 3 },
      ],
      ...base,
    });
    const response = await fetch(
      `${apiUrl}/api/account_relation/delete?signature=${signature}`,
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          sentences: [
            { sub_mid: unblocker, obj_mid: unblocked, predicate: 2 },
            { sub_mid: unblocked, obj_mid: unblocker, predicate: 3 },
          ],
          ...base,
        }),
      }
    );
    const data = await response.json();
    if (data.ret === -1) {
      Toast.show({
        type: "error",
        text1: data.msg,
        topOffset: 60,
      });
      return;
    }
  } catch (error) {
    console.error(error);
  }
}

export async function checkRelation(subMid, objMid, predicate) {
  const apiUrl = process.env.EXPO_PUBLIC_API_URL;
  try {
    const base = await baseRequest();
    const signature = await generateSignature({
      ...base,
      sub_mid: subMid,
      obj_mid: objMid,
      predicate: predicate,
    });
    const response = await fetch(
      `${apiUrl}/api/account_relation/list_by_sentence?signature=${signature}`,
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          ...base,
          sub_mid: subMid,
          obj_mid: objMid,
          predicate: predicate,
        }),
      }
    );
    const relationData = await response.json();
    if (relationData.ret === -1) {
      Toast.show({
        type: "error",
        text1: relationData.msg,
        topOffset: 60,
      });
      return;
    }
    return relationData.data.is_account_relation_existed;
  } catch (error) {
    console.error(error);
  }
}
