<?php

namespace App\Admin\Controllers\User;

use App\Admin\Actions\User\Callback;
use App\Admin\Actions\User\Profit;
use App\Admin\Actions\User\ReCode;
use App\Admin\Actions\User\RefD3Key;
use App\Admin\Renderable\User\Rule;
use App\Admin\Renderable\User\ServerKey;
use App\Models\Area;
use App\Models\User;
use Auth;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Widgets\Table;
use Illuminate\Http\Request;
use RuLong\Identity\Models\Identity;

class IndexController extends AdminController
{

    protected $title = '用户管理';

    /**
     * Notes:
     * @Author: <C.Jason>
     * @Date  : 2019/9/18 14:50
     * @return Grid
     */
    protected function grid(): Grid
    {
        $user = Auth::guard('admin')->user();

        $grid = new Grid(new User);
        $grid->model()->with(['parent']);
        $grid->actions(function ($actions) use ($user) {
            $actions->disableDelete();
            $actions->disableView();

            if ($actions->row->identity_id == 1) {
                $actions->add(new RefD3Key);
                $actions->add(new ReCode);
                $actions->add(new Callback);
            }

            if ($actions->row->identity_id == 1 && $user->id == 1) {
                $actions->add(new Profit);
            }
        });

        $grid->tools(function (Grid\Tools $tools) {
            // $tools->append(new UserImport);
        });

        $grid->model()->orderBy('id', 'desc');

//        $grid->fixColumns(2, -1);

        $grid->quickSearch('username')->placeholder('登录账户');

        $grid->filter(function ($filter) {
            $filter->column(1 / 2, function ($filter) {
                $filter->like('username', '登录账户');
                $filter->like('server_id', '渠道编号');
                $filter->like('outlet_id', '网点编号');
                $filter->like('PaOutletId', '平安网点id');
                $filter->like('shop_id', '门店号');
                $filter->between('created_at', '注册时间')->datetime();
            });
            $filter->column(1 / 2, function ($filter) {
                $filter->like('info.nickname', '渠道/网点');
                $filter->like('server_key', '服务秘钥');
                $filter->equal('identity.identity_id', '用户身份')->select([
                    ' ' => '全部',
                    '1' => '渠道商',
                    '2' => '网点',
                ]);
                $filter->equal('type', '所属项目')->select([
                    ' '      => '全部',
                    'pingan' => '平安券',
                    'wo'     => '沃支付',
                ]);
            });
        });

        $grid->column('id', '#ID#');
        $grid->column('username', '登录账户');
        $grid->column('渠道编号')->display(function () {
            return $this->server_id;
        });
        $grid->column('网点编号')->display(function () {
            return $this->outlet_id ?? '---';
        });

        $grid->column('平安网点id')->display(function () {
            return $this->PaOutletId ?? '---';
        });

        $grid->column('门店号')
             ->display(function () {
                 return $this->shop_id ?? '---';
             })
             ->help('银联pos机配置的门店号');

        $grid->column('下级网点数')
             ->display(function () {
                 return "<a href='/admin/users?server_id={$this->server_id}' style='font-size:16px'>{$this->children->count()}</a>";
             });

        $grid->column('所属项目')->display(function () {
            return $this->type_text;
        });

        $grid->column('回调地址')->display(function ($title, $column) {
            return '点击查看';
        })->modal(function ($model) {
            $data = [
                [
                    $this->callback,
                ],
            ];

            return new Table(['url'], $data);

        });

        $grid->column('密钥')->display(function ($title, $column) {
            return '点击查看';
        })->modal(ServerKey::class);

        $grid->column('nickname', '渠道/网点');
        $grid->column('用户身份')
             ->display(function () {
                 if ($this->identity_id == 1) {
                     return "<p style='color:green'>" . $this->identity_text . "</p>";
                 } else {
                     return $this->identity_text;
                 }

             });

        $grid->column('隶属渠道')->display(function () {
            return $this->parent ? $this->parent->nickname : '---';
        });

        $grid->column('分润规则')->display(function ($title, $column) {
            return '点击展开';
        })->modal(Rule::class);

        $grid->column('created_at', '注册时间');
        $grid->disableExport(false);

        $grid->export(function ($export) {
            $export->except(['密钥', '分润规则', '回调地址']);
            $export->column('用户身份', function ($value, $original) {
                return strip_tags($value);
            });
            $export->column('渠道编号', function ($value, $original) {
                return $value . "\t";
            });
            $export->column('网点编号', function ($value, $original) {
                return $value . "\t";
            });
            $export->column('门店号', function ($value, $original) {
                return $value . "\t";
            });
            $export->filename($this->title . date("YmdHis"));
        });

        return $grid;
    }

    /**
     * Notes:
     * @Author: <C.Jason>
     * @Date  : 2019/9/18 14:50
     * @return Form
     */
    protected function form()
    {
        $province = Area::where('parent_id', 1)->pluck('name', 'code');

        $form     = new Form(new User);
        $identity = Identity::find(1);

        $form->text('username', '登录账户')
             ->creationRules(['required', "unique:users", 'max:11'], ['max' => '小于11个字符'])
             ->updateRules(['required', "unique:users,username,{{id}}"])->required();

        $form->password('password', '登录密码')
             ->creationRules('required|min:6', [
                 'required' => '必填',
                 'min'      => '密码不能少于6个字符',
             ]);

        $form->text('PaOutletId', '平安网点id');
        $form->text('shop_id', '门店号')->help('银联pos里的门店号');

        $form->select('type', '项目')
             ->options(['pingan' => '平安券和自有券', 'wo' => '沃支付'])
             ->load('parent_id', '/admin/user/parent')
             ->required();

        $form->select('parent_id', '隶属渠道')
             ->options(function ($option, $info) {
                 $user = $this;
                 if (!$option || ($user && $user->identity_id == 2)) {
                     return User::with('info')->whereHas('identity', function ($q) {
                         $q->where('identity_id', 1);
                     })->when(isset($user->id), function ($q) use ($user) {
                         $q->where('type', $user->type);
                     })->orderBy('id', 'desc')->get()->pluck('nickname', 'id');
                 } else {
                     return [0 => '没有隶属渠道'];
                 }
             })
             ->default(function ($info) {
                 if ($info->model() && $info->model()->parent) {
                     return $info->model()->parent_id;
                 } else {
                     return 0;
                 }
             })
             ->help('未选择隶属渠道创建渠道账号，选择隶属渠道创建网点账号');

        $form->select('province_id', '行政省份')
             ->options($province)
             ->load('city_id', '/admin/ajax/areas/children')
             ->required();

        $form->select('city_id', '行政城市')->options(function ($option, $info) {
            if ($option) {
                return Area::whereHas('parent', function ($q) use ($info) {
                    $q->where('code', $this->province_id);
                })->pluck('name', 'code');
            }
        })->load('district_id', '/admin/ajax/areas/children')->required();

        $form->select('district_id', '行政区域')->options(function ($option, $info) {
            if ($option) {
                return Area::whereHas('parent', function ($q) use ($info) {
                    $q->where('code', $this->city_id);
                })->pluck('name', 'code');
            }
        })->required();

        $form->divider('用户资料');
        $form->text('info.nickname', '渠道/网点')->placeholder('请输入渠道/网点名称')->required();

        $form->saved(function (Form $form) {
            $user_id = $form->model()->id;
            $user    = User::find($user_id);
            if ($user->identity_id == 1 && $user->code()->count() === 0) {
                $userCodes = Identity::find(1)->codes->map(function ($code) {
                    return $code->only(['name', 'code', 'profit']);
                });
                $user->code()->createMany($userCodes);
            }

            if ($user->parent_id) {
                if ($user->server_id != $user->parent->server_id) {
                    $user->server_id = $user->parent->server_id;
                    $user->save();
                }
            }

        });

        return $form;
    }

    /**
     * 获取隶属
     * @author  玄尘 2020-03-12
     * @param  Request  $request  [description]
     * @return  [type]           [description]
     */
    public function getParent(Request $request)
    {
        $type = $request->get('q');

        $users = User::whereHas('identity', function ($query) {
            $query->where('identity_id', 1);
        })->get();

        $userRet = $users->map(function ($code) {
            return [
                'id'   => $code->id,
                'text' => $code->info->nickname,
            ];
        });
        $userRet->prepend(['id' => '', 'text' => '']);

        return $userRet;
    }

}
