require 'sqlite3'

DATA_LOCATION = './data'
DATABASE_SUBPATH = '/database'
DATABASE_NAME = '/auth.db'
FILE_STORAGE_LOCATION = '/files'

def create_new_user(username, password, is_admin)
    db = SQLite3::Database.new( DATA_LOCATION + DATABASE_SUBPATH + DATABASE_NAME )

    db.execute('
        INSERT INTO users (username, hashed_password, is_admin)
        VALUES (?, ?, ?)
    ', [username.downcase, create_password_for_user(password), is_admin])
end

def check_if_user_exists(username)
    db = SQLite3::Database.new( DATA_LOCATION + DATABASE_SUBPATH + DATABASE_NAME )

    result = db.get_first_value('SELECT COUNT(*) FROM users WHERE username = ?', username.downcase)

    if result > 0
        return true
    else
        return false
    end
end

def check_if_user_is_admin(user_id)
    db = SQLite3::Database.new( DATA_LOCATION + DATABASE_SUBPATH + DATABASE_NAME )

    result = db.get_first_value('SELECT is_admin FROM users WHERE id = ?', user_id)

    if result == 1
        return true
    else
        return false
    end
end


def get_user_id(username)
    db = SQLite3::Database.new( DATA_LOCATION + DATABASE_SUBPATH + DATABASE_NAME )

    user_id = db.get_first_value('
        SELECT      id
        FROM        users U
        WHERE       U.username = ?
            
    ', [username.downcase])

    return user_id
end

def get_user_hashed_password(user_id)
    db = SQLite3::Database.new( DATA_LOCATION + DATABASE_SUBPATH + DATABASE_NAME )

    password_hash = db.get_first_value('
        SELECT      hashed_password
        FROM        users U
        WHERE       U.id = ?
            
    ', [user_id])

    return password_hash
end

def update_user_password(user_id, password)
    db = SQLite3::Database.new( DATA_LOCATION + DATABASE_SUBPATH + DATABASE_NAME )

    db.execute('
        UPDATE users
        SET hashed_password = ?, salt = ?
        WHERE id = ?
    ', [hash_password, salt, user_id])
end

def get_claims (user_id)
    db = SQLite3::Database.new( DATA_LOCATION + DATABASE_SUBPATH + DATABASE_NAME )
    results = db.execute('
      SELECT        C.claim
      FROM          users U
        INNER JOIN  user_claims UC ON U.id = UC.user_id
        INNER JOIN  claims C ON UC.claim_id = U.id  
      WHERE         u.id = ?
    ', user_id)
    
    
    claims_list = []
  
    if results.empty?
      puts 'No claims found.'
    else
      results.each do |column|
        claim = column[0]
        claims_list << claim
      end
    end
  
    return claims_list
  end