module Base::User
  extend ActiveSupport::Concern

  included do
    self.table_name = 'Users'
    self.primary_key = 'UserID'

    alias_attribute :id, :UserID
    # alias_attribute :people_id, :PeopleID
    alias_attribute :school_id, :SchoolID
    alias_attribute :type_id, :UserTypeID
    alias_attribute :support_id, :SupportID
    alias_attribute :title_label, :Title
    alias_attribute :directory, :Directory
    alias_attribute :title_id, :TitleID
    alias_attribute :pay_status, :PayStatus
    alias_attribute :position_id, :PositionID
    alias_attribute :manager_id, :ManagerID
    alias_attribute :building_id, :BuildingID
    alias_attribute :location_id, :LocationID
    alias_attribute :first_name, :FirstName
    alias_attribute :middle_name, :MiddleName
    alias_attribute :last_name, :LastName
    alias_attribute :suffix, :Suffix
    alias_attribute :nickname, :NickName
    alias_attribute :address, :Address1
    alias_attribute :address_ext, :Address2
    alias_attribute :city, :City
    alias_attribute :state, :State
    alias_attribute :zip, :Zip
    alias_attribute :home_address, :HomeAddress1
    alias_attribute :home_address_ext, :HomeAddress2
    alias_attribute :home_city, :HomeCity
    alias_attribute :home_state, :HomeState
    alias_attribute :home_zip, :HomeZip
    # alias_attribute :spouse, :Spouse
    # alias_attribute :dependants, :Dependants
    # alias_attribute :country, :Country
    alias_attribute :legacy_home_phone, :HomePhone
    alias_attribute :legacy_work_phone, :WorkPhone1
    # alias_attribute :work_ext, :WorkExt1
    alias_attribute :legacy_work_phone_2, :WorkPhone2
    # alias_attribute :work_ext_2, :WorkExt2
    # alias_attribute :text_phone, :TextPhone
    alias_attribute :legacy_cell_phone, :CellPhone
    alias_attribute :legacy_fax_phone, :FaxPhone
    # alias_attribute :pager, :Pager
    alias_attribute :email, :EMail1
    alias_attribute :email_verified, :EMail1Verified
    # alias_attribute :email_2, :EMail2
    alias_attribute :email_3, :EMail3
    # alias_attribute :email_4, :EMail4
    # alias_attribute :email_5, :EMail5
    # alias_attribute :updated, :Updated
    alias_attribute :password, :Password
    alias_attribute :encrypted_password, :EPassword
    # alias_attribute :pw_scheme, :PWScheme
    alias_attribute :password_changed, :PWChanged
    alias_attribute :password_alert, :PWAlert
    # alias_attribute :x_password, :XPassWord
    alias_attribute :username, :UserName
    alias_attribute :last_login, :LastLogin
    # alias_attribute :last_url, :LastURL
    # alias_attribute :working, :Working
    # alias_attribute :logout, :Logout
    # alias_attribute :user_level, :UserLevel
    # alias_attribute :middle_initial, :MiddleInitial
    alias_attribute :superuser, :SuperUser
    alias_attribute :current, :Current
    alias_attribute :active, :Active
    # alias_attribute :staff_code, :StaffCode
    # alias_attribute :biography, :Biography
    # alias_attribute :subject, :Subject
    alias_attribute :photo, :PictureFile
    # alias_attribute :login_count, :LoginCount
    # alias_attribute :email_limit, :EMailLimit
    alias_attribute :gender, :Gender
    alias_attribute :date_of_birth, :DOB
    # alias_attribute :height, :Height
    # alias_attribute :weight, :Weight
    alias_attribute :race_id, :RaceID
    # alias_attribute :religion_id, :ReligionID
    # alias_attribute :tz, :TZ
    # alias_attribute :time_zone, :TimeZone
    alias_attribute :status, :UserStatus
    # alias_attribute :expression, :Expression
    # alias_attribute :staff, :Staff
    alias_attribute :family_id, :FamilyID
    alias_attribute :student_id, :StudentID
    alias_attribute :employee_id, :EmployeeID
    alias_attribute :pin, :PIN
    # alias_attribute :state_id, :StateID
    alias_attribute :contact_id, :ContactID
    alias_attribute :level, :Level
    # alias_attribute :class_columns, :ClassColumns
    # alias_attribute :tch_num, :Tchnum
    # alias_attribute :invisible, :Invisible
    # alias_attribute :social_security_number, :SSN
    alias_attribute :lunch_price_plan_id, :LPPID
    alias_attribute :parent_user_id, :ParentUserID
    # alias_attribute :parent_school_id, :ParentSchoolID
    alias_attribute :terms_of_service_date, :ToSDate
    alias_attribute :pw_recovery_time, :PWRecoveryTime

    before_save :set_defaults

    private
      def set_price_plan_default
        self.lunch_price_plan_id = nil if lunch_price_plan_id&.zero?
      end

      def set_defaults
        self.encrypted_password = default_password unless encrypted_password

        self.UserTypeID = 0 unless self.UserTypeID
        self.SupportID = 0 unless self.SupportID
        self.PayStatus = 0 unless self.PayStatus
        self.FirstName = '' unless self.FirstName
        self.Suffix = '' unless self.Suffix
        self.NickName = '' unless self.NickName
        self.address = '' unless address
        self.address_ext = '' unless address_ext
        self.state = '' unless state
        self.city = '' unless city
        self.zip = '' unless zip
        self.home_address = '' unless home_address
        self.home_address_ext = '' unless home_address_ext
        self.home_city = '' unless home_city
        self.home_state = '' unless home_state
        self.home_zip = '' unless home_zip
        self.EPassword = '' unless self.EPassword
        self.Biography = '' unless self.Biography
        self.Gender = 0 unless self.Gender
        self.TimeZone = '' unless self.TimeZone
        self.StateID = '' unless self.StateID
        self.ParentUserID = 0 unless self.ParentUserID
        self.ParentSchoolID = 0 unless self.ParentSchoolID
        self.EMail1Verified = 0 unless self.EMail1Verified
      end

      def default_password
        Faker::Internet.password(
          min_length: 10,
          max_length: 20,
          mix_case: true,
          special_characters: true
        )
      end
  end
end
