# frozen_string_literal: true

# == Schema Information
#
# Table name: users
#
#  id              :bigint           not null, primary key
#  about           :text(65535)
#  admin           :boolean          default(FALSE)
#  articles_count  :integer          default(0)
#  comments_count  :integer          default(0)
#  email           :string(191)
#  is_reviewer     :boolean          default(FALSE)
#  is_writer       :boolean          default(FALSE)
#  password_digest :string(191)
#  remember_token  :string(191)
#  taggings_count  :integer          default(0)
#  tags_count      :integer          default(0)
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#
# Indexes
#
#  index_users_on_email           (email) UNIQUE
#  index_users_on_remember_token  (remember_token) UNIQUE
#
class User < ApplicationRecord
  RSS_BOT_NAME  = "hackershare"
  RSS_BOT_EMAIL = "robot@hackershare.dev"
  has_secure_password
  has_one_attached :avatar
  has_many :auth_providers, dependent: :destroy

  has_many :comments, dependent: :destroy
  has_many :taggings
  has_many :tags
  has_many :usefuls
  has_many :useful_articles, through: :usefuls, source: "article"

  has_many :inboxes, foreign_key: :to_user_id
  has_many :sent_inboxes, foreign_key: :from_user_id

  has_many :article_reviewers, foreign_key: :reviewer_id
  has_many :to_review_articles, through: :article_reviewers, source: "article"

  scope :reviewers, -> { where(is_reviewer: true) }
  scope :writers, -> { where(is_writer: true) }
  scope :admins, -> { where(admin: true) }

  validates_format_of :email, with: /\A[^@\s]+@[^@\s]+\z/
  validates :email, uniqueness: { case_sensitive: true }

  before_create { generate_token(:remember_token) }


  def generate_token(column)
    begin
      self[column] = SecureRandom.hex(32)
    end while User.exists?(column => self[column])
  end

  attr_accessor :remember_me

  has_many :articles, dependent: :destroy

  def remember_me
    true
  end

  def username
    email.split("@")[0]
  end

  def letter_char
    email[0].upcase
  end

  def roles
    result = []
    result << "Admin" if admin?
    result << "Writer" if is_writer?
    result << "Reviewer" if is_reviewer?
    result << "User" if result.blank?
    result
  end

  def admin_group?
    admin? || is_writer? || is_reviewer?
  end

  def avatar_url(size = "80x80")
    if avatar.attached?
      avatar.service_url(fop: "imageMogr2/thumbnail/#{size}")
    else
      ["https://www.gravatar.com/avatar", Digest::MD5.hexdigest(email)].join("/")
    end
  end

  def self.find_or_create_from_auth(auth)
    auth_provider = AuthProvider.find_or_initialize_by(provider: auth["provider"], uid: auth["uid"])
    if auth_provider.new_record?
      auth_provider.data = auth
      if user = User.where("lower(email) = ?", auth["info"]["email"].downcase).first
        auth_provider.user = user
        auth_provider.save
      else
        user = auth_provider.build_user(
          email: auth["info"]["email"],
          password: SecureRandom.hex
        )
        auth_provider.save
      end
    else
      user = auth_provider.user
    end
    user
  end
end
