<?php
declare(strict_types=1);

/**
 * 部门模型，对应 admin_depa 表
 */
class Depa extends Model
{
    protected string $table = 'admin_depa';
    protected string $key = 'admin_depa_id';

    protected function gridFrom(): string
    {
        return '`admin_depa` d'
            . ' LEFT JOIN `sys_depa_role` dr ON dr.`sys_depa_role_lnk_depa_id` = d.`admin_depa_id`'
            . ' LEFT JOIN `sys_role` r ON r.`sys_role_id` = dr.`sys_depa_role_lnk_role_id`';
    }

    protected function gridSelect(): string
    {
        return 'd.*,'
            . ' GROUP_CONCAT(DISTINCT r.`sys_role_name` SEPARATOR \', \') AS `depa_role_names`,'
            . ' GROUP_CONCAT(DISTINCT r.`sys_role_id` SEPARATOR \',\') AS `depa_role_ids`';
    }

    protected function gridGroupBy(): string
    {
        return 'd.`admin_depa_id`';
    }

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

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

        return $result;
    }

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

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

        return $depaId;
    }

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

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

        return $result;
    }

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

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

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

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