<?php

namespace App\Admin\Controllers;

use App\Admin\Repositories\Covenant;
use App\Models\Covenant as ModelsCovenant;
use App\Models\Lawyer as ModelLawyer;
use App\Models\Principal as ModelPrincipal;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Admin\Actions\CovenantClosed;
use App\Admin\Actions\CovenantReturn;
use Dcat\Admin\Admin;
use Illuminate\Support\Facades\DB;

class CovenantController extends AdminController
{
    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        return Grid::make(ModelsCovenant::with(['lawyer']), function (Grid $grid) {
            $grid->model()->orderBy('id', 'DESC');
            //$grid->column('id')->sortable();
            $grid->column('number');
            $grid->column('cname');
            $grid->column('ctype')->display(function ($val) {
                return Covenant::CTYPE[$val];
            });
            $grid->column('sign_at');
            $grid->column('principal', '委托人');
            $grid->column('lawyer.name', '办案律师');
            $grid->column('amount');
            $grid->column('payment_method')->display(function ($val) {
                return $val == 1 ? '开票付款' : '付款开票';
            });
            $grid->column('reserve_fee', '预留结案费');
            $grid->column('is_closed', '结案状态')->display(function ($val) {
                return $val ? '已结案' : '未结案';
            });
            $grid->column('is_return', '退还状态')->display(function ($val) {
                return $val ? '已退还' : '未退还';
            });
            $grid->column('return_fee', '退还结案费');
            // $grid->column('created_at');
            // $grid->column('updated_at')->sortable();

            $grid->disableViewButton();
            $grid->disableRowSelector();

            $grid->filter(function (Grid\Filter $filter) {
                // 更改为 panel 布局
                $filter->panel();
                $filter->like('number')->width(3);
                $filter->like('cname')->width(3);
                $filter->like('principal', '委托人')->width(3);
                $filter->like('lawyer.name', '办案律师')->width(3);
                $filter->equal('ctype')->select(Covenant::CTYPE)->width(3);
                $filter->equal('payment_method')->select(Covenant::PAYMENT_METHOD)->width(3);
                $filter->between('sign_at', '签约日期')->date()->width(4);
            });

            $grid->actions(function (Grid\Displayers\Actions $actions) {
                //编辑
                if (!Admin::user()->can('hetong-edit')) {
                    $actions->disableEdit();
                }
                //删除
                if (!Admin::user()->can('hetong-delete')) {
                    $actions->disableDelete();
                }
                //已结案
                if (Admin::user()->can('hetong-closed') && $actions->row->is_closed == 0) {
                    $actions->append(new CovenantClosed('已结案', $actions->row->id));
                }
                // 已退还
                if (Admin::user()->can('hetong-return') && $actions->row->is_return == 0) {
                    $actions->append(new CovenantReturn('已退还', $actions->row->id));
                }
            });
        });
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     *
     * @return Show
     */
    protected function detail($id)
    {
        return Show::make($id, new Covenant(), function (Show $show) {
            $show->field('id');
            $show->field('number');
            $show->field('cname');
            $show->field('ctype');
            $show->field('sign_at');
            $show->field('principal_id');
            $show->field('lawyer_id');
            $show->field('amount');
            $show->field('payment_method');
            $show->field('case_reason');
            $show->field('created_at');
            $show->field('updated_at');
        });
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {

        $list = ModelLawyer::select(['id', 'number', 'name'])->limit(1000)->get()->toArray();
        $lawyers = [];
        if ($list) {
            foreach ($list as $item) {
                $lawyers[$item['id']] = $item['number'] . ' ' . $item['name'];
            }
        }

        $form =  Form::make(new Covenant(), function (Form $form) use ($lawyers) {
            $form->display('id');
            $form->text('number')->required();
            $form->select('ctype')->options(Covenant::CTYPE)->default(1);
            $form->text('cname')->required();
            $form->date('sign_at')->format('YYYY-MM-DD')->default(date("Y-m-d"));
            $form->select('principal_type')->options([1 => '单位', 2 => '个人'])->default(1)->load('principal_id', '/principal-list');;
            $form->select('principal_id');
            $form->text('case_reason');
            $form->select('lawyer_id')->options($lawyers);
            $form->text('amount');
            $form->select('payment_method')->options(Covenant::PAYMENT_METHOD)->default(1);

            $form->disableCreatingCheck();
            $form->disableEditingCheck();
            $form->disableViewCheck();
            $form->disableDeleteButton();
            $form->disableViewButton();

            $form->display('created_at');
            $form->display('updated_at');
        });

        $form->saved(
            function (Form $form, $result) {
                $cid = $form->getKey();
                if (isset($_POST['principal_id']) && $_POST['principal_id']) {
                    $pObj = ModelPrincipal::find($_POST['principal_id']);
                    $pname = $pObj->name ? $pObj->name : $pObj->company;
                    DB::table('covenant')->where("id", $cid)->update(['principal' => $pname]);
                }
            }
        );
        return $form;
    }
}