<?php
declare(strict_types=1);

/**
 * dxDataGrid 布局方案，对应 sysDxDataGrid 表，按用户 + grid 标识 + 方案名称区分
 */
class GridLayout extends Model
{
    protected string $table = 'sysDxDataGrid';
    protected string $key = 'sysDxDataGrid_id';

    public function save(int $adminId, string $gridName, string $schemeName, string $stateJson): void
    {
        $existing = $this->db->get($this->table, [$this->key], [
            'sysDxDataGrid_lnk_admin_id' => $adminId,
            'sysDxDataGrid_grid_name'    => $gridName,
            'sysDxDataGrid_scheme_name'  => $schemeName,
        ]);

        if ($existing) {
            $this->db->update($this->table, ['sysDxDataGrid_state' => $stateJson], [$this->key => $existing[$this->key]]);
            return;
        }

        $this->db->insert($this->table, [
            'sysDxDataGrid_lnk_admin_id' => $adminId,
            'sysDxDataGrid_grid_name'    => $gridName,
            'sysDxDataGrid_scheme_name'  => $schemeName,
            'sysDxDataGrid_state'        => $stateJson,
        ]);
    }

    public function load(int $adminId, string $gridName, string $schemeName): ?string
    {
        $row = $this->db->get($this->table, ['sysDxDataGrid_state'], [
            'sysDxDataGrid_lnk_admin_id' => $adminId,
            'sysDxDataGrid_grid_name'    => $gridName,
            'sysDxDataGrid_scheme_name'  => $schemeName,
        ]);

        return $row['sysDxDataGrid_state'] ?? null;
    }

    /**
     * 列出某个用户在某个 grid 下保存的所有方案名称
     */
    public function listSchemes(int $adminId, string $gridName): array
    {
        return $this->db->select($this->table, ['sysDxDataGrid_scheme_name', 'sysDxDataGrid_update_time'], [
            'sysDxDataGrid_lnk_admin_id' => $adminId,
            'sysDxDataGrid_grid_name'    => $gridName,
            'ORDER'                      => ['sysDxDataGrid_update_time' => 'DESC'],
        ]);
    }

    public function remove(int $adminId, string $gridName, string $schemeName): void
    {
        $this->db->delete($this->table, [
            'sysDxDataGrid_lnk_admin_id' => $adminId,
            'sysDxDataGrid_grid_name'    => $gridName,
            'sysDxDataGrid_scheme_name'  => $schemeName,
        ]);
    }
}
