<PhoenixKitWeb.Components.LayoutWrapper.app_layout
  socket={@socket}
  flash={@flash}
  phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
  page_title={gettext("Settings")}
  page_subtitle={gettext("Configure system preferences and options")}
  current_path={@url_path}
  project_title={@project_title}
  current_locale={@current_locale}
>
  <div class="flex flex-col px-4 py-6">
    <%!-- Settings Form --%>
    <div class="card bg-base-100 shadow-xl">
      <div class="card-body">
        <h2 class="card-title text-xl mb-6">{gettext("System Configuration")}</h2>

        <.form
          :let={_form}
          for={@changeset}
          id="settings_form"
          phx-submit="save_settings"
          phx-change="validate_settings"
          class="space-y-6"
        >
          <%!-- Hidden fields for required settings from Users page --%>
          <%!-- Use @saved_settings to preserve database values, not @settings which may have incorrect form state --%>
          <input
            type="hidden"
            name="settings[allow_registration]"
            value={@saved_settings["allow_registration"]}
          />
          <input
            type="hidden"
            name="settings[new_user_default_role]"
            value={@saved_settings["new_user_default_role"]}
          />
          <input
            type="hidden"
            name="settings[new_user_default_status]"
            value={@saved_settings["new_user_default_status"]}
          />
          <input
            type="hidden"
            name="settings[track_registration_geolocation]"
            value={@saved_settings["track_registration_geolocation"]}
          />

          <.section_header icon="hero-identification" title={gettext("Site Identity")} />

          <%!-- Project Title Setting --%>
          <div class="form-control w-full">
            <label class="label">
              <span class="label-text text-base font-medium">{gettext("Project Title")}</span>
              <span class="label-text-alt text-sm text-base-content/60">
                {gettext("Application name display")}
              </span>
            </label>
            <.input
              name="settings[project_title]"
              type="text"
              value={@settings["project_title"]}
              class="focus:input-primary"
              placeholder={gettext("Enter project title")}
              phx-debounce="500"
            />
            <.unsaved_hint
              dirty={@settings["project_title"] != @saved_settings["project_title"]}
              saved={@saved_settings["project_title"]}
            />
          </div>

          <%!-- Project Logo --%>
          <div class="form-control w-full">
            <label class="label">
              <span class="label-text text-base font-medium">{gettext("Project Logo")}</span>
            </label>
            <input
              type="hidden"
              name="settings[auth_logo_file_uuid]"
              value={@settings["auth_logo_file_uuid"]}
            />
            <%= if (@settings["auth_logo_file_uuid"] || "") != "" do %>
              <div class="flex items-center gap-3 p-2 bg-base-200 rounded-lg">
                <img
                  src={signed_preview_url(@settings["auth_logo_file_uuid"], "medium")}
                  alt="Logo preview"
                  class="h-20 object-contain"
                />
                <button
                  type="button"
                  class="btn btn-ghost btn-sm"
                  phx-click="clear_image"
                  phx-value-target="logo"
                >
                  {gettext("Remove")}
                </button>
              </div>
            <% else %>
              <button
                type="button"
                class="btn btn-outline btn-sm w-fit"
                phx-click="open_media_selector"
                phx-value-target="logo"
              >
                {gettext("Select Image")}
              </button>
            <% end %>
            <div class="label">
              <span class="label-text-alt text-xs text-base-content/50">
                {gettext(
                  "Logo displayed across the application. Falls back to the site icon, then the project title text."
                )}
                <%= if (@settings["auth_logo_file_uuid"] || "") == "" &&
                      (@settings["site_icon_file_uuid"] || "") != "" do %>
                  <span class="text-info">{gettext("Currently using the site icon.")}</span>
                <% end %>
              </span>
            </div>
          </div>

          <%!-- Browser Tab: site icon + default tab title as one identity group,
               with a live browser-chrome preview (WordPress site-icon style). --%>
          <div class="form-control w-full">
            <label class="label">
              <span class="label-text text-base font-medium">{gettext("Browser Tab")}</span>
              <span class="label-text-alt text-sm text-base-content/60">
                {gettext("Site icon and tab title")}
              </span>
            </label>
            <input
              type="hidden"
              name="settings[site_icon_file_uuid]"
              value={@settings["site_icon_file_uuid"]}
            />

            <%!-- The favicon defaults to the project logo when unset (and vice
                 versa) — mirror that fallback so the preview shows what the
                 browser will actually render. --%>
            <% preview_icon_uuid =
              if (@settings["site_icon_file_uuid"] || "") != "",
                do: @settings["site_icon_file_uuid"],
                else: @settings["auth_logo_file_uuid"] %>

            <div class="rounded-box border border-base-300 overflow-hidden">
              <%!-- Live preview: tab strip. The title updates as you type
                   (the form's phx-change refreshes @settings). --%>
              <div class="bg-base-200 px-4 pt-3">
                <div class="flex items-end gap-2">
                  <div class="hidden sm:flex items-center gap-1.5 mb-2.5 mr-1">
                    <span class="w-2.5 h-2.5 rounded-full bg-error/60"></span>
                    <span class="w-2.5 h-2.5 rounded-full bg-warning/60"></span>
                    <span class="w-2.5 h-2.5 rounded-full bg-success/60"></span>
                  </div>
                  <div class="flex items-center gap-2 bg-base-100 rounded-t-lg px-3 py-2 min-w-0 max-w-[260px] shadow-sm">
                    <%= if (preview_icon_uuid || "") != "" do %>
                      <img
                        src={signed_preview_url(preview_icon_uuid, "thumbnail")}
                        alt=""
                        class="w-4 h-4 rounded-sm object-cover shrink-0"
                      />
                    <% else %>
                      <.icon name="hero-globe-alt" class="w-4 h-4 text-base-content/30 shrink-0" />
                    <% end %>
                    <span class="text-xs font-medium truncate">
                      {if (@settings["default_tab_title"] || "") != "",
                        do: @settings["default_tab_title"],
                        else: @settings["project_title"] || "My Site"}
                    </span>
                    <.icon
                      name="hero-x-mark"
                      class="w-3 h-3 text-base-content/40 shrink-0 ml-auto"
                    />
                  </div>
                  <div class="mb-2.5 ml-1 text-base-content/40">
                    <.icon name="hero-plus" class="w-3.5 h-3.5" />
                  </div>
                </div>
              </div>
              <%!-- Address bar --%>
              <div class="bg-base-100 border-b border-base-300 px-4 py-2 flex items-center gap-3">
                <div class="hidden sm:flex items-center gap-2 text-base-content/25">
                  <.icon name="hero-arrow-left" class="w-3.5 h-3.5" />
                  <.icon name="hero-arrow-right" class="w-3.5 h-3.5" />
                  <.icon name="hero-arrow-path" class="w-3.5 h-3.5" />
                </div>
                <div class="flex items-center gap-1.5 bg-base-200 rounded-full px-3 py-1 flex-1 max-w-xs min-w-0">
                  <.icon name="hero-lock-closed" class="w-3 h-3 text-base-content/40 shrink-0" />
                  <span class="text-xs text-base-content/50 truncate">{site_host()}</span>
                </div>
              </div>

              <%!-- Controls --%>
              <div class="p-4 sm:p-5 bg-base-100 flex flex-col sm:flex-row gap-5">
                <div class="flex items-start gap-4">
                  <%= if (@settings["site_icon_file_uuid"] || "") != "" do %>
                    <img
                      src={signed_preview_url(@settings["site_icon_file_uuid"], "thumbnail")}
                      alt={gettext("Site icon preview")}
                      class="w-16 h-16 rounded-2xl object-cover ring-1 ring-base-300 shadow-sm shrink-0"
                    />
                    <div class="flex flex-col gap-2">
                      <button
                        type="button"
                        class="btn btn-outline btn-sm"
                        phx-click="open_media_selector"
                        phx-value-target="site_icon"
                      >
                        {gettext("Change icon")}
                      </button>
                      <button
                        type="button"
                        class="btn btn-ghost btn-sm text-error"
                        phx-click="clear_image"
                        phx-value-target="site_icon"
                      >
                        {gettext("Remove")}
                      </button>
                    </div>
                  <% else %>
                    <button
                      type="button"
                      class="w-16 h-16 rounded-2xl border-2 border-dashed border-base-300 hover:border-primary hover:text-primary text-base-content/40 flex items-center justify-center transition-colors shrink-0"
                      title={gettext("Select site icon")}
                      phx-click="open_media_selector"
                      phx-value-target="site_icon"
                    >
                      <.icon name="hero-photo" class="w-6 h-6" />
                    </button>
                    <div class="flex flex-col gap-2">
                      <button
                        type="button"
                        class="btn btn-outline btn-sm"
                        phx-click="open_media_selector"
                        phx-value-target="site_icon"
                      >
                        {gettext("Select site icon")}
                      </button>
                      <p class="text-xs text-base-content/50 max-w-[16rem]">
                        {gettext("Square, at least 512×512 pixels.")}
                        <%= if (@settings["auth_logo_file_uuid"] || "") != "" do %>
                          {gettext("Currently using the project logo.")}
                        <% end %>
                      </p>
                    </div>
                  <% end %>
                </div>

                <div class="divider divider-horizontal m-0 hidden sm:flex"></div>

                <div class="flex-1 min-w-0">
                  <label class="label pt-0 pb-1">
                    <span class="label-text text-sm font-medium">
                      {gettext("Default Tab Title")}
                    </span>
                  </label>
                  <.input
                    name="settings[default_tab_title]"
                    type="text"
                    value={@settings["default_tab_title"]}
                    class="focus:input-primary"
                    placeholder={@settings["project_title"] || gettext("e.g. Welcome to My Site")}
                    phx-debounce="300"
                  />
                  <p class="text-xs text-base-content/50 mt-2">
                    {gettext(
                      "Shown when a page doesn't set its own title. Leave empty to use the project title."
                    )}
                  </p>
                </div>
              </div>
            </div>

            <div class="label">
              <span class="label-text-alt text-xs text-base-content/50">
                {gettext(
                  "The icon appears in browser tabs, bookmarks, and on phone home screens."
                )}
              </span>
            </div>
          </div>

          <.section_header icon="hero-globe-alt" title={gettext("Site Address")} />

          <%!-- Site Address URL Setting --%>
          <div class="form-control w-full">
            <label class="label">
              <span class="label-text text-base font-medium">
                {gettext("Site Address (URL)")}
              </span>
              <span class="label-text-alt text-sm text-base-content/60">
                {gettext("Public base URL of this application")}
              </span>
            </label>
            <.input
              name="settings[site_url]"
              type="url"
              value={@settings["site_url"]}
              class="focus:input-primary"
              placeholder="https://site.com"
              phx-debounce="500"
            />
            <.unsaved_hint
              dirty={@settings["site_url"] != @saved_settings["site_url"]}
              saved={
                if @saved_settings["site_url"] != "",
                  do: @saved_settings["site_url"],
                  else: gettext("(empty)")
              }
            />
          </div>

          <.section_header icon="hero-adjustments-horizontal" title={gettext("Features")} />

          <%!-- Notifications --%>
          <div class="form-control w-full">
            <label class="label">
              <span class="label-text text-base font-medium">
                {gettext("Notifications")}
              </span>
              <span class="label-text-alt text-sm text-base-content/60">
                {gettext("Per-user inbox driven by the activity feed")}
              </span>
            </label>
            <.checkbox
              name="settings[notifications_enabled]"
              checked={@settings["notifications_enabled"] == "true"}
              label={gettext("Enable user notifications")}
            >
              <:description>
                {gettext(
                  "When on, users receive a bell notification whenever an activity targets them (e.g., their post is liked)."
                )}
              </:description>
            </.checkbox>

            <%!-- Default notification destination (catch-all click target) --%>
            <label class="label pt-3">
              <span class="label-text">{gettext("Default notification link")}</span>
            </label>
            <.input
              type="text"
              name="settings[notification_default_link]"
              value={@settings["notification_default_link"] || "/dashboard"}
              placeholder="/dashboard"
              class="input-sm max-w-md"
            />
            <div class="label">
              <span class="label-text-alt text-xs text-base-content/50">
                {gettext(
                  "Where a notification opens when it has no link of its own. Defaults to /dashboard (every signed-in user can reach it). Clear the field to make such notifications non-clickable instead. The URL prefix and locale are added automatically."
                )}
              </span>
            </div>
          </div>

          <.section_header icon="hero-pencil-square" title={gettext("Content Editor")} />

          <div class="grid grid-cols-1 md:grid-cols-2 gap-x-6 gap-y-2">
            <%!-- Default Editor Mode Setting --%>
            <div class="form-control w-full">
              <label class="label">
                <span class="label-text text-base font-medium">
                  {gettext("Default Editor Mode")}
                </span>
                <span class="label-text-alt text-sm text-base-content/60">
                  {gettext("Mode every content editor opens in")}
                </span>
              </label>
              <.select
                name="settings[editor_default_mode]"
                value={@settings["editor_default_mode"]}
                options={@setting_options["editor_default_mode"]}
                class="focus-within:select-primary"
              />
              <div class="label">
                <span class="label-text-alt text-xs text-base-content/50">
                  {gettext(
                    "Applies site-wide wherever the rich-text editor is rendered (posts, comments). Users can still switch modes inside the editor."
                  )}
                </span>
              </div>
              <.unsaved_hint
                dirty={@settings["editor_default_mode"] != @saved_settings["editor_default_mode"]}
                saved={
                  get_option_label(
                    @saved_settings["editor_default_mode"],
                    @setting_options["editor_default_mode"]
                  )
                }
              />
            </div>
          </div>

          <.section_header icon="hero-clock" title={gettext("Date & Time")} />

          <div class="grid grid-cols-1 md:grid-cols-2 gap-x-6 gap-y-2">
            <%!-- Week Start Day Setting --%>
            <div class="form-control w-full">
              <label class="label">
                <span class="label-text text-base font-medium">{gettext("Week Start On")}</span>
                <span class="label-text-alt text-sm text-base-content/60">
                  {gettext("First day of the week")}
                </span>
              </label>
              <.select
                name="settings[week_start_day]"
                value={@settings["week_start_day"]}
                options={@setting_options["week_start_day"]}
                class="focus-within:select-primary"
              />
              <.unsaved_hint
                dirty={@settings["week_start_day"] != @saved_settings["week_start_day"]}
                saved={
                  get_option_label(
                    @saved_settings["week_start_day"],
                    @setting_options["week_start_day"]
                  )
                }
              />
            </div>

            <%!-- Time Zone Setting --%>
            <div class="form-control w-full">
              <label class="label">
                <span class="label-text text-base font-medium">{gettext("Time Zone")}</span>
                <span class="label-text-alt text-sm text-base-content/60">
                  {gettext("System default timezone")}
                </span>
              </label>
              <.select
                name="settings[time_zone]"
                value={@settings["time_zone"]}
                options={@setting_options["time_zone"]}
                class="focus-within:select-primary"
              />
              <.unsaved_hint
                dirty={@settings["time_zone"] != @saved_settings["time_zone"]}
                saved={get_timezone_label(@saved_settings["time_zone"], @setting_options)}
              />
            </div>

            <%!-- Date Format Setting --%>
            <div class="form-control w-full">
              <label class="label">
                <span class="label-text text-base font-medium">{gettext("Date Format")}</span>
                <span class="label-text-alt text-sm text-base-content/60">
                  {gettext("How dates are displayed")}
                </span>
              </label>
              <.select
                name="settings[date_format]"
                value={@settings["date_format"]}
                options={@setting_options["date_format"]}
                class="focus-within:select-primary"
              />
              <div class="label">
                <span class="label-text-alt text-xs text-base-content/50">
                  {gettext("Example:")} {get_current_date_example(@settings["date_format"])}
                </span>
              </div>
              <.unsaved_hint
                dirty={@settings["date_format"] != @saved_settings["date_format"]}
                saved={
                  get_option_label(
                    @saved_settings["date_format"],
                    @setting_options["date_format"]
                  )
                }
              />
            </div>

            <%!-- Time Format Setting --%>
            <div class="form-control w-full">
              <label class="label">
                <span class="label-text text-base font-medium">{gettext("Time Format")}</span>
                <span class="label-text-alt text-sm text-base-content/60">
                  {gettext("How times are displayed")}
                </span>
              </label>
              <.select
                name="settings[time_format]"
                value={@settings["time_format"]}
                options={@setting_options["time_format"]}
                class="focus-within:select-primary"
              />
              <div class="label">
                <span class="label-text-alt text-xs text-base-content/50">
                  {gettext("Example:")} {get_current_time_example(@settings["time_format"])}
                </span>
              </div>
              <.unsaved_hint
                dirty={@settings["time_format"] != @saved_settings["time_format"]}
                saved={
                  get_option_label(
                    @saved_settings["time_format"],
                    @setting_options["time_format"]
                  )
                }
              />
            </div>
          </div>

          <%!-- Action Buttons --%>
          <div class="flex gap-3 pt-4">
            <button
              type="submit"
              class={[
                "btn btn-primary flex-1",
                if(@saving, do: "loading", else: "")
              ]}
              disabled={@saving}
            >
              <%= if @saving do %>
                {gettext("Saving...")}
              <% else %>
                {gettext("Save All Settings")}
              <% end %>
            </button>

            <button
              type="button"
              class="btn btn-outline"
              phx-click="reset_to_defaults"
              data-confirm={
                gettext(
                  "Reset ALL settings to their defaults? Your title, logo, formats and feature toggles will be replaced. This cannot be undone."
                )
              }
            >
              <PhoenixKitWeb.Components.Core.Icons.icon_refresh class="w-4 h-4 mr-2" /> {gettext(
                "Reset"
              )}
            </button>
          </div>
        </.form>

        <%!-- Footnote --%>
        <div class="flex items-start gap-2 mt-6 text-xs text-base-content/50">
          <.icon name="hero-information-circle" class="w-4 h-4 shrink-0 mt-0.5" />
          <p>
            {gettext(
              "Changes apply system-wide after \"Save All Settings\". Registration and user defaults are managed on the Users page."
            )}
          </p>
        </div>
      </div>
    </div>
  </div>
  <.live_component
    :if={@show_media_selector}
    module={PhoenixKitWeb.Live.Components.MediaSelectorModal}
    id="settings-media-selector"
    show={@show_media_selector}
    mode={:single}
    selected_uuids={[]}
    phoenix_kit_current_user={assigns[:phoenix_kit_current_user]}
  />
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>
