<template>
  <QuickNav selected="Home"></QuickNav>
  <!-- CONTENT -->
  <section id="Content" class="p-6 pb-24 max-w-3xl mx-auto">
    <!-- Breadcrumb -->
    <div id="ViewBreadcrumb" class="mb-8">
      <h1 class="text-lg text-center font-light relative px-7">
        <!-- Back -->
        <router-link
          :to="{ name: 'home' }"
          class="text-lg text-center px-2 py-1 absolute -left-2 -top-1"
          ><font-awesome icon="chevron-left" class="fa-fw"></font-awesome>
        </router-link>
        {{ stepType === "giver" ? "Given by..." : "Given to..." }}
      </h1>
    </div>

    <!-- Results List -->
    <ul class="border-t border-slate-300">
      <li class="border-b border-slate-300 py-3">
        <h2 class="text-base flex gap-4 items-center">
          <span class="grow">
            <img
              src="../assets/blank-square.svg"
              width="32"
              class="inline-block align-middle border border-slate-300 rounded-md mr-1"
            />
            Unnamed/Unknown
          </span>
          <span class="text-right">
            <button
              type="button"
              class="block w-full text-center text-sm uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md"
              @click="openDialog('Unnamed')"
            >
              <font-awesome icon="gift" class="fa-fw"></font-awesome>
            </button>
          </span>
        </h2>
      </li>
      <li
        v-for="contact in allContacts"
        :key="contact.did"
        class="border-b border-slate-300 py-3"
      >
        <h2 class="text-base flex gap-4 items-center">
          <span class="grow font-semibold">
            <EntityIcon
              :contact="contact"
              :icon-size="32"
              class="inline-block align-middle border border-slate-300 rounded-md mr-1"
            />
            {{ contact.name || "(no name)" }}
          </span>
          <span class="text-right">
            <button
              type="button"
              class="block w-full text-center text-sm uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md"
              @click="openDialog(contact)"
            >
              <font-awesome icon="gift" class="fa-fw"></font-awesome>
            </button>
          </span>
        </h2>
      </li>
    </ul>

    <GiftedDialog
      ref="customDialog"
      :from-project-id="fromProjectId"
      :to-project-id="toProjectId"
      :show-projects="showProjects"
      :is-from-project-view="isFromProjectView"
    />
  </section>
</template>

<script lang="ts">
import { Component, Vue } from "vue-facing-decorator";
import { RouteLocationNormalizedLoaded, Router } from "vue-router";

import GiftedDialog from "../components/GiftedDialog.vue";
import QuickNav from "../components/QuickNav.vue";
import EntityIcon from "../components/EntityIcon.vue";
import { NotificationIface, USE_DEXIE_DB } from "../constants/app";
import { db, retrieveSettingsForActiveAccount } from "../db/index";
import { Contact } from "../db/tables/contacts";
import * as databaseUtil from "../db/databaseUtil";
import { GiverReceiverInputInfo } from "../libs/util";
import { logger } from "../utils/logger";
import { PlatformServiceFactory } from "@/services/PlatformServiceFactory";
@Component({
  components: { GiftedDialog, QuickNav, EntityIcon },
})
export default class ContactGiftingView extends Vue {
  $notify!: (notification: NotificationIface, timeout?: number) => void;
  $route!: RouteLocationNormalizedLoaded;
  $router!: Router;

  activeDid = "";
  allContacts: Array<Contact> = [];
  apiServer = "";
  description = "";
  projectId = "";
  prompt = "";
  recipientProjectName = "";
  recipientProjectImage = "";
  recipientProjectHandleId = "";

  // New context parameters
  stepType = "giver";
  giverEntityType = "person" as "person" | "project";
  recipientEntityType = "person" as "person" | "project";
  giverProjectId = "";
  giverProjectName = "";
  giverProjectImage = "";
  giverProjectHandleId = "";
  giverDid = "";
  recipientDid = "";
  fromProjectId = "";
  toProjectId = "";
  showProjects = false;
  isFromProjectView = false;

  async created() {
    try {
      let settings = await databaseUtil.retrieveSettingsForActiveAccount();
      if (USE_DEXIE_DB) {
        settings = await retrieveSettingsForActiveAccount();
      }
      this.apiServer = settings.apiServer || "";
      this.activeDid = settings.activeDid || "";

      const platformService = PlatformServiceFactory.getInstance();
      const dbAllContacts = await platformService.dbQuery(
        "SELECT * FROM contacts ORDER BY name",
      );
      this.allContacts = databaseUtil.mapQueryResultToValues(
        dbAllContacts,
      ) as unknown as Contact[];
      if (USE_DEXIE_DB) {
        await db.open();
        // .orderBy("name") wouldn't retrieve any entries with a blank name
        // .toCollection.sortBy("name") didn't sort in an order I understood
        const baseContacts = await db.contacts.toArray();
        this.allContacts = baseContacts.sort((a, b) =>
          (a.name || "").localeCompare(b.name || ""),
        );
      }

      this.projectId =
        (this.$route.query["recipientProjectId"] as string) || "";
      this.recipientProjectName =
        (this.$route.query["recipientProjectName"] as string) || "";
      this.recipientProjectImage =
        (this.$route.query["recipientProjectImage"] as string) || "";
      this.recipientProjectHandleId =
        (this.$route.query["recipientProjectHandleId"] as string) || "";
      this.prompt = (this.$route.query["prompt"] as string) ?? this.prompt;

      // Read new context parameters
      this.stepType = (this.$route.query["stepType"] as string) || "giver";
      this.giverEntityType =
        (this.$route.query["giverEntityType"] as "person" | "project") ||
        "person";
      this.recipientEntityType =
        (this.$route.query["recipientEntityType"] as "person" | "project") ||
        "person";
      this.giverProjectId =
        (this.$route.query["giverProjectId"] as string) || "";
      this.giverProjectName =
        (this.$route.query["giverProjectName"] as string) || "";
      this.giverProjectImage =
        (this.$route.query["giverProjectImage"] as string) || "";
      this.giverProjectHandleId =
        (this.$route.query["giverProjectHandleId"] as string) || "";
      this.giverDid = (this.$route.query["giverDid"] as string) || "";
      this.recipientDid = (this.$route.query["recipientDid"] as string) || "";
      this.fromProjectId = (this.$route.query["fromProjectId"] as string) || "";
      this.toProjectId = (this.$route.query["toProjectId"] as string) || "";
      this.showProjects =
        (this.$route.query["showProjects"] as string) === "true";
      this.isFromProjectView =
        (this.$route.query["isFromProjectView"] as string) === "true";

      // eslint-disable-next-line @typescript-eslint/no-explicit-any
    } catch (err: any) {
      logger.error("Error retrieving settings & contacts:", err);
      this.$notify(
        {
          group: "alert",
          type: "danger",
          title: "Error",
          text:
            err.message ||
            "There was an error retrieving your settings or contacts.",
        },
        5000,
      );
    }
  }

  openDialog(contact?: GiverReceiverInputInfo | "Unnamed") {
    if (contact === "Unnamed") {
      // Special case: Pass undefined to trigger Step 1, but with "Unnamed" pre-selected
      let recipient: GiverReceiverInputInfo;
      let giver: GiverReceiverInputInfo | undefined;

      if (this.stepType === "giver") {
        // We're selecting a giver, so recipient is either a project or the current user
        if (this.recipientEntityType === "project") {
          recipient = {
            did: this.recipientProjectHandleId,
            name: this.recipientProjectName,
            image: this.recipientProjectImage,
            handleId: this.recipientProjectHandleId,
          };
        } else {
          recipient = { did: this.activeDid, name: "You" };
        }
        giver = undefined; // Will be set to "Unnamed" in GiftedDialog
      } else {
        // We're selecting a recipient, so recipient is "Unnamed" and giver is preserved from context
        recipient = { did: "", name: "Unnamed" };

        // Preserve the existing giver from the context
        if (this.giverEntityType === "project") {
          giver = {
            did: this.giverProjectHandleId,
            name: this.giverProjectName,
            image: this.giverProjectImage,
            handleId: this.giverProjectHandleId,
          };
        } else if (this.giverDid) {
          giver = {
            did: this.giverDid,
            name: this.giverProjectName || "Someone",
          };
        } else {
          giver = { did: this.activeDid, name: "You" };
        }
      }

      (this.$refs.customDialog as GiftedDialog).open(
        giver,
        recipient,
        undefined,
        this.stepType === "giver" ? "Given by Unnamed" : "Given to Unnamed",
        this.prompt,
      );
      // Immediately select "Unnamed" and move to Step 2
      (this.$refs.customDialog as GiftedDialog).selectGiver();
    } else {
      // Regular case: contact is a GiverReceiverInputInfo
      let giver: GiverReceiverInputInfo;
      let recipient: GiverReceiverInputInfo;

      if (this.stepType === "giver") {
        // We're selecting a giver, so the contact becomes the giver
        giver = contact as GiverReceiverInputInfo; // Safe because we know contact is not "Unnamed" or undefined

        // Recipient is either a project or the current user
        if (this.recipientEntityType === "project") {
          recipient = {
            did: this.recipientProjectHandleId,
            name: this.recipientProjectName,
            image: this.recipientProjectImage,
            handleId: this.recipientProjectHandleId,
          };
        } else {
          recipient = { did: this.activeDid, name: "You" };
        }
      } else {
        // We're selecting a recipient, so the contact becomes the recipient
        recipient = contact as GiverReceiverInputInfo; // Safe because we know contact is not "Unnamed" or undefined

        // Preserve the existing giver from the context
        if (this.giverEntityType === "project") {
          giver = {
            did: this.giverProjectHandleId,
            name: this.giverProjectName,
            image: this.giverProjectImage,
            handleId: this.giverProjectHandleId,
          };
        } else if (this.giverDid) {
          giver = {
            did: this.giverDid,
            name: this.giverProjectName || "Someone",
          };
        } else {
          giver = { did: this.activeDid, name: "You" };
        }
      }

      (this.$refs.customDialog as GiftedDialog).open(
        giver,
        recipient,
        undefined,
        this.stepType === "giver"
          ? "Given by " + (contact?.name || "someone not named")
          : "Given to " + (contact?.name || "someone not named"),
        this.prompt,
      );
    }
  }
}
</script>
