import options from "options"
const { messageAsync } = await Service.import("hyprland")

const {
  hyprland,
  theme: {
    radius,
    blur,
    shadows,
    dark: {
      primary: { bg: darkActive },
    },
    light: {
      primary: { bg: lightActive },
    },
    scheme,
  },
} = options

const deps = [
  "hyprland",
  radius.id,
  blur.id,
  shadows.id,
  darkActive.id,
  lightActive.id,
  scheme.id,
]

function activeBorder() {
  const color = scheme.value === "dark"
    ? darkActive.value
    : lightActive.value

  return color.replace("#", "")
}

function sendBatch(batch: string[]) {
  const cmd = batch
    .filter(x => !!x)
    .map(x => `keyword ${x}`)
    .join("; ")

  return messageAsync(`[[BATCH]]/${cmd}`)
}

async function setupHyprland() {
  sendBatch([
    `general:border_size ${hyprland.borderSize.value}`,
    `general:gaps_out ${hyprland.gapsOut.value}`,
    `general:gaps_in ${hyprland.gapsIn.value}`,
    `general:col.active_border rgba(${activeBorder()}ff)`,
    `general:col.inactive_border rgba(${hyprland.inactiveBorder.value})`,
    `decoration:rounding ${radius}`,
    `decoration:drop_shadow ${shadows.value ? "yes" : "no"}`,
    `dwindle:no_gaps_when_only ${hyprland.gapsWhenOnly.value ? 0 : 1}`,
    `master:no_gaps_when_only ${hyprland.gapsWhenOnly.value ? 0 : 1}`,
  ])

  await sendBatch(App.windows.map(({ name }) => `layerrule unset, ${name}`))

  if (blur.value > 0) {
    sendBatch(App.windows.flatMap(({ name }) => [
      `layerrule unset, ${name}`,
      `layerrule blur, ${name}`,
      `layerrule ignorealpha ${/* based on shadow color */.29}, ${name}`,
    ]))
  }
}

export default function init() {
  options.handler(deps, setupHyprland)
  setupHyprland()
}
