<?php

namespace App\Http\Controllers\Admin\User;

use App\Exports\StudentExport;
use App\Http\Controllers\Controller;
use App\Imports\StudentsImport;
use App\Jobs\ImportStudentJob;
use App\Repositories\Enums\ResponseCodeEnum;
use App\Repositories\Models\Base\Admin;
use App\Repositories\Models\Base\Resource;
use App\Repositories\Models\User\Student;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Jiannei\Response\Laravel\Support\Facades\Response;
use Maatwebsite\Excel\Facades\Excel;
use Prettus\Validator\Contracts\ValidatorInterface;
use App\Contracts\Repositories\User\StudentRepository;
use App\Repositories\Validators\User\StudentValidator;

/**
 * Class StudentsController.
 *
 * @package namespace App\Http\Controllers\Admin\User;
 */
class StudentController extends Controller
{
    /**
     * @var StudentRepository
     */
    protected $repository;

    /**
     * @var StudentValidator
     */
    protected $validator;

    /**
     * StudentsController constructor.
     *
     * @param StudentRepository $repository
     * @param StudentValidator $validator
     */
    public function __construct(StudentRepository $repository, StudentValidator $validator)
    {
        $this->repository = $repository;
        $this->validator = $validator;
    }

    public function index()
    {
        $lists = $this->repository->paginate(request('per_page', self::PAGE_NUM));
        return Response::success($lists);
    }

    /**
     * 添加菜单
     * @param Request $request
     * Author: Mead
     */
    public function store(Request $request)
    {
        $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE));
        if (Admin::query()->where('username', $request->get('account'))->exists()) {
            return Response::fail('账户已存在');
        }

        if (Student::query()->where('account', $request->get('account'))->exists()) {
            return Response::fail('账户已存在');
        }

        try {
            $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE)));
            $student = $this->repository->create($data);
            return Response::success($student);
        } catch (\Exception $e) {
            return $this->errorStore($e);
        }
    }

    public function update($id, Request $request)
    {
        $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_UPDATE));
        try {
            $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_UPDATE)));
            $student = $this->repository->update($data, $id);
            return Response::success($student);
        } catch (\Exception $e) {
            $this->errorStore($e);
        }
    }


    public function show($id)
    {
        $courseCategory = $this->repository->find($id);
        return Response::success($courseCategory);
    }

    public function destroy($id)
    {
        try {
            $re = $this->repository->delete($id);
            if ($re) {
                return Response::success(null, T('successfully delete.'));
            }
            return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
        } catch (\Exception $exception) {
            return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
        }
    }

    public function delete(Request $request)
    {
        try {
            $this->validate($request, [
                'ids' => 'required|array',
            ]);

            $ids = $request->get('ids');
            $this->repository->whereIn('id', $ids)->delete();
            return Response::success(null, T('successfully delete.'));
        } catch (\Exception $exception) {
            return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
        }
    }

    public function import(Request $request)
    {
        $this->validate($request, [
            'id' => 'required|integer',
        ]);

        $resource = Resource::query()->where('id', $request->get('id'))->first();
        if (!$resource) {
            return $this->errorFail();
        }

//        Excel::import(new StudentsImport(), Storage::disk($resource['disk'])->path($resource['path']));
        $this->dispatch(new ImportStudentJob($resource['disk'], $resource['path']));
        return Response::success(null, '正在导入,请稍后');
    }

    /**
     * 导出
     * Author: Mead
     */
    public function export(Request $request)
    {
        $this->validate($request, [
            'ids' => 'required|array',
            'fields' => 'sometimes|array',
        ]);
        $ids = $request->get('ids');
        $name = time();
        return (new StudentExport($request->get('fields', [0, 1, 2, 3, 4, 5, 6, 7])))->forIds($ids)->download($name . '.xlsx', null, [
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Methods' => '*',
            'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With',
            'Access-Control-Expose-Headers' => 'Content-Disposition',
            'Content-type' => 'application/octet-stream',
            'Content-Disposition' => 'attachment; filename=' . $name . '.xlsx',
        ]);
    }
}