<?php
declare(strict_types=1);

/**
 * 会员模型，对应 member 表（对外用户，跟系统用户 admin_user 分开）
 */
class Member extends Model
{
    protected string $table = 'member';
    protected string $key = 'member_id';

    protected function gridFrom(): string
    {
        return '`member` m'
            . ' LEFT JOIN `sys_member_role` mr ON mr.`sys_member_role_lnk_member_id` = m.`member_id`'
            . ' LEFT JOIN `sys_role` r ON r.`sys_role_id` = mr.`sys_member_role_lnk_role_id`';
    }

    protected function gridSelect(): string
    {
        // 同 Users 的部门聚合做法：MySQL 5.7 没有 JSON_ARRAYAGG，先 GROUP_CONCAT 角色ID字符串，PHP 端切成数组
        return 'm.*,'
            . ' GROUP_CONCAT(r.`sys_role_name` SEPARATOR \', \') AS `member_role_names`,'
            . ' GROUP_CONCAT(r.`sys_role_id` SEPARATOR \',\') AS `member_role_ids`';
    }

    protected function gridGroupBy(): string
    {
        return 'm.`member_id`';
    }

    public function grid(array $loadOptions): array
    {
        $result = parent::grid($loadOptions);

        foreach ($result['data'] as &$row) {
            $row['member_role_ids'] = !empty($row['member_role_ids'])
                ? array_map('intval', explode(',', $row['member_role_ids']))
                : [];
        }

        return $result;
    }

    public function gridInsert(array $values): mixed
    {
        $roleIds = $this->extractRoleIds($values);

        if (!empty($values['member_password'])) {
            $values['member_password'] = password_hash($values['member_password'], PASSWORD_DEFAULT);
            $values['member_password_update_time'] = date('Y-m-d H:i:s');
        }

        $memberId = parent::gridInsert($values);
        if ($roleIds !== null) {
            (new Role($this->db))->bindToMember((int) $memberId, $roleIds);
        }

        return $memberId;
    }

    public function gridUpdate(mixed $key, array $values): int
    {
        $roleIds = $this->extractRoleIds($values);

        if (!empty($values['member_password'])) {
            $values['member_password'] = password_hash($values['member_password'], PASSWORD_DEFAULT);
            $values['member_password_update_time'] = date('Y-m-d H:i:s');
        } else {
            unset($values['member_password']);
        }

        $result = $values ? parent::gridUpdate($key, $values) : 0;

        if ($roleIds !== null) {
            (new Role($this->db))->bindToMember((int) $key, $roleIds);
        }

        return $result;
    }

    private function extractRoleIds(array &$values): ?array
    {
        unset($values['member_role_names']);

        if (!array_key_exists('member_role_ids', $values)) {
            return null;
        }

        $ids = $values['member_role_ids'];
        unset($values['member_role_ids']);

        return array_map('intval', is_array($ids) ? $ids : []);
    }
}
