<?php

namespace loyalsoft;

/**
 * 每月登录记录
 */
class MonthLogin {

    /**
     * @var int 数据
     */
    public int $data = 0;

    /**
     *  构造函数
     * @param int $intVal
     */
    public function __construct(int $intVal) {
        $this->data = $intVal;
    }

    /**
     * 判断指定的date是否登录过
     * @param int $day 天
     * @return bool  true: 登录过, false: 未登录
     */
    public function IsLogin(int $day): bool {
        return $this->get($day);
    }

    /**
     *  记录某天的登录行为
     * @param int $day
     */
    public function Login(int $day) {
        $this->set($day, true);
    }

    /**
     * 获得当月的登录天数统计
     * @return int 总共登录了多少天
     */
    public function LoginDays(): int {
        $n = 0;
        array_walk(Bits::GetBits($this->data), fn(bool $i) => $n += $i ? 1 : 0);
        return $n;
    }

    /**
     * 查看某天是否登录过
     * @param int $day date
     * @return bool  true:登录过, false: 未登录
     */
    public function get(int $day): bool {
        my_Assert($day >= 0 && $day <= 30, "index is Out Of Range(0..30).");    # 索引出错
        return Bits::GetBitValue($this->data, $day);
    }

    /**
     *  设置某天的登录状态
     * @param int $day date
     * @param bool $isLogin  true: 登录过, false:未登录过
     * @return int
     */
    public function set(int $day, bool $isLogin): int {
        my_Assert($day >= 0 && $day <= 30, "index is Out Of Range(0..30).");    # 索引出错
        return Bits::SetBitValue($this->data, $day, $isLogin);
    }

    /**
     * 给调试输出用的
     * @return type
     */
    public function __debugInfo() {
        return array_slice(Bits::GetBits($this->data), 0, 31);
    }

}
