# frozen_string_literal: true

class User < ApplicationRecord
  before_save { self.email = email.downcase }

  ##### ActiveRecord Associations
  has_many :parties, dependent: :destroy
  has_many :favorites, dependent: :destroy
  has_many :collection_characters, dependent: :destroy
  has_many :collection_weapons, dependent: :destroy
  has_many :collection_summons, dependent: :destroy
  has_many :collection_job_accessories, dependent: :destroy

  # Note: The crew association will be added when crews feature is implemented
  # belongs_to :crew, optional: true

  ##### ActiveRecord Validations
  validates :username,
            presence: true,
            length: { minimum: 3, maximum: 26 }

  validates :email,
            presence: true,
            uniqueness: true,
            email: true

  validates :password,
            length: { minimum: 8 },
            presence: true,
            on: :create

  validates :password,
            length: { minimum: 8 },
            on: :update,
            if: :password_digest_changed?

  validates :password_confirmation,
            presence: true,
            on: :create

  validates :password_confirmation,
            presence: true,
            on: :update,
            if: :password_digest_changed?

  ##### ActiveModel Security
  has_secure_password

  ##### Enums
  # Enum for collection privacy levels
  enum :collection_privacy, {
    everyone: 0,
    crew_only: 1,
    private_collection: 2
  }, prefix: true

  ##### Instance Methods
  def favorite_parties
    favorites.map(&:party)
  end

  def admin?
    role == 9
  end

  def blueprint
    UserBlueprint
  end

  # Check if collection is viewable by another user
  def collection_viewable_by?(viewer)
    return true if self == viewer # Owners can always view their own collection

    case collection_privacy
    when 'everyone'
      true
    when 'crew_only'
      # Will be implemented when crew feature is added:
      # viewer.present? && crew.present? && viewer.crew_id == crew_id
      false # For now, crew_only acts like private until crews are implemented
    when 'private_collection'
      false
    else
      false
    end
  end

  # Helper method to check if user is in same crew (placeholder for future)
  def in_same_crew_as?(other_user)
    # Will be implemented when crew feature is added:
    # return false unless other_user.present?
    # crew.present? && other_user.crew_id == crew_id
    false
  end
end