# FileDummy Sample Ruby File
# A sample covering common Ruby patterns

require 'json'
require 'net/http'
require 'uri'

# ── Class with modules ───────────────────────
module Validatable
  def valid?
    validate
    errors.empty?
  end

  def errors
    @errors ||= []
  end

  protected

  def add_error(message)
    errors << message
  end
end

class User
  include Validatable

  attr_accessor :id, :name, :email, :role

  def initialize(id:, name:, email:, role: 'user')
    @id = id
    @name = name
    @email = email
    @role = role
  end

  def validate
    add_error("Name can't be blank") if name.nil? || name.strip.empty?
    add_error("Invalid email") unless email =~ /\A[^@\s]+@[^@\s]+\z/
    add_error("Invalid role") unless %w[admin user guest].include?(role)
  end

  def to_h
    { id: id, name: name, email: email, role: role }
  end

  def to_json(*_args)
    to_h.to_json
  end
end

# ── Service class ────────────────────────────
class UserService
  def initialize
    @users = {}
    @next_id = 1
  end

  def create(name:, email:, role: 'user')
    user = User.new(id: @next_id, name: name, email: email, role: role)
    return nil unless user.valid?

    @users[@next_id] = user
    @next_id += 1
    user
  end

  def find(id)
    @users[id]
  end

  def all
    @users.values
  end

  def active_users
    @users.values.select { |u| u.role != 'guest' }
  end
end

# ── Usage ────────────────────────────────────
if __FILE__ == $0
  service = UserService.new
  service.create(name: 'Alice', email: 'alice@example.com', role: 'admin')
  service.create(name: 'Bob', email: 'bob@example.com')

  puts JSON.pretty_generate(service.all.map(&:to_h))
end
