<?php

namespace Modules\Manage\Http\Controllers;

use Catch\Base\CatchController;
use Illuminate\Http\Request;
use Modules\Channel\Models\UserHasMiniprograms;
use Modules\Channel\Services\User\UserService;
use Modules\Channel\Exceptions\ChannelBusinessException;
use Modules\Common\Errors\Errors;
use Modules\Manage\Models\Miniprogram;
use Log;

class UserMiniprogramController extends CatchController
{

    const  COMPANY_ROLE = 'company';
    public function __construct(
        protected readonly UserHasMiniprograms $userHasMiniprograms,
        protected readonly Miniprogram $miniprogram
        )
    {
        
    }


    /**
     * 绑定小程序和投放公司的关系
     * @param [type] $miniprogram_id 
     * @param Request $request  uid=2,3,4,5 actison=on|off on:分配,off取消分配
     * @return array
     * 
     */
    public function allocationStore($miniprogram_id,Request $request)
    {
        $uids  = $request->post('uids');
        $action = $request->post('action');
        if(empty($miniprogram_id) || empty($uids) || empty($action) || !in_array($action,['on','off'])){
            ChannelBusinessException::throwError(Errors::PARAM_EMPTY);
        }

        $miniprogram_info =  $this->miniprogram->find($miniprogram_id);
        if(!$miniprogram_info || $miniprogram_info->status == 0){
            ChannelBusinessException::throwError(Errors::MINIPROGRAM_STATUS_ERROR);
        }

        return collect(explode(',',$uids))->filter(function (int $value, int $key) use($miniprogram_id,$action){
            $user_access = UserService::userHasRole($value,self::COMPANY_ROLE);
            //只能分配给投手公司
            if($user_access){
                $result = $this->userHasMiniprograms->where('uid',$value)->where('miniprogram_id',$miniprogram_id)->first();
                if($action == 'off'){
                    if($result){
                        $result->is_enabled = 0;
                        $result->save();
                    }
                    return true;
                }
                if($result){
                    if($result->is_enabled == 0){
                        $result->is_enabled = 1;
                        $result->save();
                    }
                    return true;
                }
                $this->userHasMiniprograms->create([
                    'uid'=>$value,'miniprogram_id'=>$miniprogram_id,'is_enabled'=>1
                ]);
                return true;
            }
            return false;
        });

    }


    /**
     * 获取投手公司和小程序的绑定关系,用于前端数据回显
     * @param [type] $miniprogram_id
     * @return []
     * response = [
     *      'on'=>[ ['id'=>1,'username'=>'公司1','user_has_miniprogram'=>1],[]  ],
     *      'off'=>[['id'=>1,'username'=>'公司1','user_has_miniprogram'=>0],[]],
     *      'all'=>[ 
     *          ['id'=>1,'username'=>'公司1','user_has_miniprogram'=>1],
     *          ['id'=>2,'username'=>'公司1','user_has_miniprogram'=>0] 
     *          ]
     *      ]
     * 
     */
    public function getAllocationInfo($miniprogram_id){
        $all_company_account = UserService::listByRole(self::COMPANY_ROLE,['users.username','users.id']);
        $result = $all_company_account->map(function ($item,$key) use($miniprogram_id) {
            $info = $this->userHasMiniprograms->where('uid',$item->id)->where('miniprogram_id',$miniprogram_id)->where('is_enabled',1)->count();
            if($info){
                $item->user_has_miniprogram = 1;
                $item->user_has_miniprogram_flag = 'on';
            }else{
                $item->user_has_miniprogram = 0;
                $item->user_has_miniprogram_flag = 'off';
            }
            return $item;
        });
        $group = $result->groupBy('user_has_miniprogram_flag')->toArray();
        if(!isset($group['on'])){
            $group['on'] = [];
        }
        if(!isset($group['off'])){
            $group['off'] = [];
        }
        $group['all'] = $result->toArray();
        return $group;
    }

}