<?php
// +----------------------------------------------------------------------
// | 骑行打卡活动
// +----------------------------------------------------------------------
// | Author: 赖清涛 <laiqingtao@chinacpt.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);

namespace app\terminal\service;

use app\terminal\model\SignAction as SignActionModel;
use app\terminal\model\UploadFile as UploadFileModel;
use app\terminal\service\store\User as StoreUserService;
use app\terminal\validate\SignAction as SignActionValidate;
use app\common\service\BaseService;
use cores\exception\BaseException;

/**
 * 服务类: 骑行打卡活动
 * Class Sign
 * @package app\terminal\service
 */
class Sign extends BaseService
{
    public $signId;
    /**
     * 获取列表记录
     * @param array $param
     * @return \think\Paginator
     * @throws \think\db\exception\DbException
     */
    public function getList(array $param = []): \think\Paginator
    {
        $model = new SignActionModel;
        return $model->getList($param);
    }


    /**
     * 添加新记录
     * @param array $data
     * @return bool|false
     */
    public function add(array $data): bool
    {
        // 数据验证
        $this->validate($data);
        // 当前用户ID
        $userId = StoreUserService::getLoginUserId();
        $model = new SignActionModel;
        $res = $model->add($data, $userId);
        $this->signId = $model['id'] ?: 0;
        return $res;
    }

    /**
     * 活动详情
     * @param int $signId 活动ID
     * @return static|array|null
     */
    public function detail(int $signId)
    {
        // 关联查询
        $with = ['addressList'];
        $signInfo = SignActionModel::detail($signId,  $with);
        if (empty($signInfo)) {
            throwError('打卡活动不存在');
        }
        $signInfo = $signInfo->toArray();
        // 查询图片
        $file_ids = [$signInfo['cover_img_id'], $signInfo['rule_img_id']];
        if (!empty($signInfo['addressList'])) {
            $qrurl_ids = array_column($signInfo['addressList'], 'qrurl_id');
            $receive_url_ids = array_column($signInfo['addressList'], 'receive_url_id');
            $file_ids = array_merge($file_ids, $qrurl_ids, $receive_url_ids);
        }
        $file_ids = array_filter(array_unique($file_ids));
        $files = [];
        if (!empty($file_ids)) {
            $uploadFileModel = new UploadFileModel();
            $files = $uploadFileModel->getAll(['file_ids' => $file_ids]);
            if (!empty($files)) {
                $files = array_column($files, null, 'file_id');
            }
        }
        $cover_img =  $files[$signInfo['cover_img_id']] ?? [];
        $rule_img =  $files[$signInfo['rule_img_id']] ?? [];
        $signInfo['cover_img'] = $cover_img;
        $signInfo['cover_img_url'] = $cover_img['external_url'] ?? '';
        $signInfo['rule_img'] = $rule_img;
        $signInfo['rule_img_url'] = $rule_img['external_url'] ?? '';
        if (!empty($signInfo['addressList'])) {
            $signInfo['addressList'] = array_map(function ($item) use ($files) {
                $item['qrurl'] = $files[$item['qrurl_id']]['external_url'] ?? '';
                $item['receive_url'] = $files[$item['receive_url_id']]['external_url'] ?? '';
                return $item;
            }, $signInfo['addressList']);
        }
        return $signInfo;
    }

    /**
     * 更新活动
     * @param int $signId
     * @param array $data
     * @return bool
     */
    public function edit(int $signId, array $data): bool
    {
        // 数据验证
        $this->validate($data);

        // 当前用户ID
        $userId = StoreUserService::getLoginUserId();

        // 关联查询
        $with = ['addressList'];
        $signInfo = SignActionModel::detail($signId,  $with);
        if (empty($signInfo)) {
            throwError('打卡活动不存在');
        }
        return $signInfo->edit($data, $userId);
    }

    /**
     * 删除活动
     * @param int $signId 活动ID
     * @return bool
     */
    public function setDelete(int $signId): bool
    {
        $model = SignActionModel::detail($signId);
        if (empty($model)) {
            throwError('打卡活动不存在');
        }
        return $model->setDelete();
    }

    /**
     * 数据验证
     * @param array $data
     * @return void
     * @throws BaseException
     */
    private function validate(array $data): void
    {
        // 数据验证
        $validate = new SignActionValidate;
        if (!$validate->check($data)) {
            throwError($validate->getError());
        }
    }
}
