import re

with open("apps/wallet_database/lib/wallet_database/schemas/auth/user.ex", "r") as f:
    content = f.read()

# Add JSON encoder field
enc_old = ":mfa_enabled,"
enc_new = ":mfa_enabled,\n             :user_type,"
content = content.replace(enc_old, enc_new)

# Add schema field
schema_old = 'field :kyc_status, :string, default: "pending"'
schema_new = 'field :kyc_status, :string, default: "pending"\n    field :user_type, :string, default: "customer"'
content = content.replace(schema_old, schema_new)

# Required fields and constants
req_old = """  @required [:user_id, :email, :status, :tier, :kyc_status]
  @optional [:phone_number, :display_name, :mfa_enabled, :correlation_id, :metadata, :roles]

  @valid_statuses ~w(active suspended closed)
  @valid_kyc_statuses ~w(pending submitted approved rejected expired)
  @valid_tiers ~w(standard premium business)"""
  
req_new = """  @required [:user_id, :email, :status, :tier, :user_type]
  @optional [:phone_number, :display_name, :kyc_status, :mfa_enabled, :correlation_id, :metadata, :roles]

  @valid_statuses ~w(active suspended closed)
  @valid_kyc_statuses ~w(pending submitted approved rejected expired exempt)
  @valid_tiers ~w(standard premium business)
  @valid_user_types ~w(admin customer merchant)"""
content = content.replace(req_old, req_new)

# Changeset logic
cset_old = """  def changeset(user, attrs) do
    user
    |> cast(attrs, @required ++ @optional)
    |> validate_required(@required)
    |> validate_inclusion(:status, @valid_statuses)
    |> validate_inclusion(:kyc_status, @valid_kyc_statuses)
    |> validate_inclusion(:tier, @valid_tiers)
    |> validate_format(:email, ~r/^[^\s@]+@[^\s@]+\.[^\s@]+$/)
    |> unique_constraint(:email)
    |> unique_constraint(:phone_number)
  end"""

cset_new = """  def changeset(user, attrs) do
    changeset =
      user
      |> cast(attrs, @required ++ @optional)
      |> validate_required(@required)
      |> validate_inclusion(:user_type, @valid_user_types)
      |> validate_inclusion(:status, @valid_statuses)
      |> validate_inclusion(:tier, @valid_tiers)
      |> validate_format(:email, ~r/^[^\s@]+@[^\s@]+\.[^\s@]+$/)
      |> unique_constraint(:email)
      |> unique_constraint(:phone_number)
      
    # Dynamic KYC based on user_type
    user_type = get_field(changeset, :user_type)
    
    if user_type == "admin" do
      changeset
      |> put_change(:kyc_status, "exempt")
      |> validate_inclusion(:kyc_status, @valid_kyc_statuses)
    else
      # If not admin, kyc_status is effectively required, default to pending if missing
      changeset
      |> put_change(:kyc_status, get_field(changeset, :kyc_status) || "pending")
      |> validate_required([:kyc_status])
      |> validate_inclusion(:kyc_status, @valid_kyc_statuses)
    end
  end"""
content = content.replace(cset_old, cset_new)

with open("apps/wallet_database/lib/wallet_database/schemas/auth/user.ex", "w") as f:
    f.write(content)

