<?php

namespace Modules\Manage\Http\Controllers;

use Illuminate\Routing\Controller;
use Catch\Base\CatchController;
use Illuminate\Http\Request;
use Modules\Manage\Enmus\MiniprogramType;
use Modules\Manage\Http\Requests\MiniprogramRequest;
use Modules\Manage\Http\Requests\MiniprogramUpdateRequest;
use Modules\Manage\Models\Miniprogram;
use Modules\Channel\Models\UserHasMiniprograms;
use Illuminate\Support\Facades\DB;
use Log;
use Modules\Channel\Services\User\UserService;

class MiniprogramController extends CatchController
{

    public function __construct(protected readonly Miniprogram $miniprogram,protected readonly UserHasMiniprograms $userHasMiniprograms)
    {
        
    }

    /**
     * 小程序列表
     * @param Request $request
     * @return void
     */
    public function index(Request $request)
    {
        $uid = $this->getLoginUser()->id;
        $name = $request->get('name');
        $play_name = $request->get('play_name');
        $company = $request->get('company');
        $type = $request->get('type');
        $page_size = $request->input('limit', 15);
        $where = [];
        if($name){
            $where[] = ['name','like','%'.$name.'%']; 
        }
        if($play_name){
            $where[] = ['play_name','like','%'.$play_name.'%']; 
        }
        if($company){
            $where[] = ['company','like','%'.$company.'%']; 
        }

        if($type){
            $where[] = ['type','=',$type];
        }
        if(UserService::userHasRole($uid,'administrator')){
            $result = $this->miniprogram->where($where)->orderBy('id','desc')->paginate($page_size);
        }else{
            $result = $this->userHasMiniprograms->join('miniprogram','miniprogram.id','=','user_has_miniprograms.miniprogram_id')
            ->where('user_has_miniprograms.is_enabled',1)
            ->where('uid',$uid)
            ->where($where)
            ->select('miniprogram.*')
            ->paginate($page_size);
        }
       
        foreach($result as $item){
            $item->type_name = MiniprogramType::from($item->type)->name();
            $item->status_name = $item->status == 1 ?'启用':'禁用';
        }
        return $result;
    }

    /**
     * 添加小程序
     *
     * @param MiniprogramRequest $request
     * @return void
     */
    public function store(MiniprogramRequest $request)
    {
        $validate_result = $request->validated();
        $validate_result['remark'] = $request->post('remark','') ?? '';
        return $this->miniprogram->create($validate_result)->toArray();

    }

    /**
     * 小程序详情
     *
     * @param [type] $id
     * @return void
     */
    public function show($id)
    {
        return $this->miniprogram->find($id)->toArray();
    }

    /**
     * 更新小程序
     *
     * @param [type] $id
     * @param MiniprogramUpdateRequest $request
     * @return void
     */
    public function update($id, MiniprogramUpdateRequest $request)
    {
        $validate_result = $request->validated();
        if($request->post('remark','')){
            $validate_result['remark'] = $request->post('remark','');
        }
        $this->miniprogram->where('id',$id)->update($validate_result);
        return [];
    }


    /**
     * 小程序类型列表
     *
     * @return array [ ['name'=>'微信小程序','id'=>1],[],[] ]
     */
    public function typeList(){
        $type_list =  MiniprogramType::cases();
        $data = array_map( fn($item)=>['name'=>$item->name(),'value'=>$item->value()],$type_list );
        return $data;
    }


    /**
     * 获取所有公司
     *
     * @return void
     */
    public function companyList(){
        return $this->miniprogram->select(DB::raw('distinct company'))->get()->pluck('company');
    }
}