import GLib from "gi://GLib"
import icons from "../../lib/icons.js"

const time = (time, format = "%H:%M") => GLib.DateTime
  .new_from_unix_local(time)
  .format(format)

const NotificationIcon = ({ app_entry, app_icon, image }) => {
  if (image) {
    return Widget.Box({
      vpack: "start",
      hexpand: false,
      class_name: "icon img",
      css: `
                background-image: url("${image}");
                background-size: cover;
                background-repeat: no-repeat;
                background-position: center;
                min-width: 78px;
                min-height: 78px;
            `,
    })
  }

  let icon = icons.fallback.notification
  if (Utils.lookUpIcon(app_icon))
    icon = app_icon

  if (Utils.lookUpIcon(app_entry || ""))
    icon = app_entry || ""

  return Widget.Box({
    vpack: "start",
    hexpand: false,
    class_name: "icon",
    css: `
            min-width: 78px;
            min-height: 78px;
        `,
    child: Widget.Icon({
      icon,
      size: 58,
      hpack: "center", hexpand: true,
      vpack: "center", vexpand: true,
    }),
  })
}

export default (notification) => {
  const content = Widget.Box({
    class_name: "content",
    children: [
      NotificationIcon(notification),
      Widget.Box({
        hexpand: true,
        vertical: true,
        children: [
          Widget.Box({
            children: [
              Widget.Label({
                class_name: "title",
                xalign: 0,
                justification: "left",
                hexpand: true,
                max_width_chars: 24,
                truncate: "end",
                wrap: true,
                label: notification.summary.trim(),
                use_markup: true,
              }),
              Widget.Label({
                class_name: "time",
                vpack: "start",
                label: time(notification.time),
              }),
              Widget.Button({
                class_name: "close-button",
                vpack: "start",
                hexpand: false,
                vexpand: false,
                child: Widget.Icon("window-close-symbolic"),
                on_clicked: notification.close,
              }),
            ],
          }),
          Widget.Label({
            class_name: "description",
            hexpand: true,
            use_markup: true,
            xalign: 0,
            justification: "left",
            label: notification.body.trim(),
            max_width_chars: 24,
            wrap: true,
          }),
        ],
      }),
    ],
  })

  const actionsbox = notification.actions.length > 0 ? Widget.Revealer({
    transition: "slide_down",
    child: Widget.EventBox({
      child: Widget.Box({
        class_name: "actions horizontal",
        children: notification.actions.map(action => Widget.Button({
          class_name: "action-button",
          on_clicked: () => notification.invoke(action.id),
          hexpand: true,
          child: Widget.Label(action.label),
        })),
      }),
    }),
  }) : null

  const eventbox = Widget.EventBox({
    vexpand: false,
    on_primary_click: notification.dismiss,
    on_hover() {
      if (actionsbox)
        actionsbox.reveal_child = true
    },
    on_hover_lost() {
      if (actionsbox)
        actionsbox.reveal_child = true

      notification.dismiss()
    },
    child: Widget.Box({
      vertical: true,
      children: actionsbox ? [content, actionsbox] : [content],
    }),
  })

  return Widget.Box({
    class_name: `notification ${notification.urgency}`,
    child: eventbox,
  })
}
