import re

with open("apps/wallet_web/lib/wallet_web/live/admin/user_management_live/index.ex", "r") as f:
    content = f.read()

# 1. Update mount
mount_old = """  @impl true
  def mount(_params, _session, socket) do
    users = fetch_users()
    roles_opts = WalletWeb.Authorization.Policy.known_roles()
    
    {:ok,
     socket
     |> assign(:page_title, "User Management")
     |> assign(:users, users)
     |> assign(:roles_opts, roles_opts)
     |> assign(:search_query, "")}
  end"""

mount_new = """  @impl true
  def mount(_params, _session, socket) do
    users = fetch_users()
    roles_opts = WalletWeb.Authorization.Policy.known_roles()
    
    {:ok,
     socket
     |> assign(:page_title, "User Management")
     |> assign(:users, users)
     |> assign(:roles_opts, roles_opts)
     |> assign(:search_query, "")
     |> assign(:show_new_user_modal, false)
     |> assign(:new_user_form, to_form(User.changeset(%User{}, %{})))}
  end"""

content = content.replace(mount_old, mount_new)

# 2. Add event handlers before def render
events_new = """
  @impl true
  def handle_event("search", %{"q" => q}, socket) do
    q = String.trim(q)
    users = if q == "", do: fetch_users(), else: search_users(q)
    
    {:noreply, assign(socket, search_query: q, users: users)}
  end

  def handle_event("open_new_user", _, socket) do
    {:noreply, assign(socket, show_new_user_modal: true, new_user_form: to_form(User.changeset(%User{}, %{})))}
  end

  def handle_event("close_new_user", _, socket) do
    {:noreply, assign(socket, show_new_user_modal: false)}
  end

  def handle_event("validate_user", %{"user" => user_params}, socket) do
    changeset =
      %User{}
      |> User.changeset(user_params)
      |> Map.put(:action, :validate)

    {:noreply, assign(socket, new_user_form: to_form(changeset))}
  end

  def handle_event("save_user", %{"user" => user_params}, socket) do
    # Ensure a user_id is generated if not present
    user_with_id = %User{user_id: Ecto.UUID.generate()}
    changeset = User.changeset(user_with_id, user_params)

    case Repo.insert(changeset) do
      {:ok, _user} ->
        {:noreply,
         socket
         |> put_flash(:info, "User created successfully.")
         |> assign(:show_new_user_modal, false)
         |> assign(:users, fetch_users())}

      {:error, %Ecto.Changeset{} = changeset} ->
        {:noreply, assign(socket, new_user_form: to_form(changeset))}
    end
  end
"""

content = re.sub(r'  @impl true\n  def handle_event\("search"[^\n]+\n(?:[^\n]+\n)+    \{:noreply, assign\(socket, search_query: q, users: users\)\}\n  end\n', events_new, content)

# 3. Update the button
button_old = """<button class="rounded-lg bg-zinc-900 text-white px-4 py-2 text-sm font-medium shadow-sm hover:bg-zinc-800">
          <.icon name="hero-plus" class="mr-2 h-4 w-4 inline" />Add User
        </button>"""

button_new = """<button phx-click="open_new_user" class="rounded-lg bg-zinc-900 text-white px-4 py-2 text-sm font-medium shadow-sm hover:bg-zinc-800">
          <.icon name="hero-plus" class="mr-2 h-4 w-4 inline" />Add User
        </button>"""

content = content.replace(button_old, button_new)

# 4. Insert Modal before closing view inside render
modal_code = """
    <.modal id="new-user-modal" show={@show_new_user_modal} on_cancel={JS.push("close_new_user")}>
      <div class="mb-4">
        <h2 class="text-lg font-semibold text-zinc-900">Add New User</h2>
        <p class="text-sm text-zinc-500">Create a new user with required profile information.</p>
      </div>

      <.form for={@new_user_form} phx-change="validate_user" phx-submit="save_user" class="space-y-4">
        <.input field={@new_user_form[:email]} type="email" label="Email Address" required />
        <.input field={@new_user_form[:display_name]} type="text" label="Display Name" />
        
        <div class="grid grid-cols-2 gap-4">
          <.input field={@new_user_form[:tier]} type="select" label="Tier" options={[{"Standard", "standard"}, {"Premium", "premium"}, {"Business", "business"}]} />
          <.input field={@new_user_form[:kyc_status]} type="select" label="KYC Status" options={[{"Pending", "pending"}, {"Submitted", "submitted"}, {"Approved", "approved"}, {"Rejected", "rejected"}, {"Expired", "expired"}]} />
        </div>
        
        <.input field={@new_user_form[:status]} type="select" label="Status" options={[{"Active", "active"}, {"Suspended", "suspended"}, {"Closed", "closed"}]} />

        <div class="mt-6 flex justify-end gap-3">
          <button type="button" phx-click="close_new_user" class="px-4 py-2 text-sm font-medium text-zinc-700 bg-white border border-zinc-300 rounded-lg shadow-sm hover:bg-zinc-50">
            Cancel
          </button>
          <.button type="submit" phx-disable-with="Saving..." class="px-4 py-2 text-sm font-medium text-white bg-indigo-600 rounded-lg shadow-sm hover:bg-indigo-700">
            Create User
          </.button>
        </div>
      </.form>
    </.modal>
"""

content = content.replace("    </div>\n    \"\"\"\n  end", "    </div>\n" + modal_code + "    \"\"\"\n  end")

with open("apps/wallet_web/lib/wallet_web/live/admin/user_management_live/index.ex", "w") as f:
    f.write(content)

