<?php

namespace App\Http\Controllers\Admin;

use App\Models\CustomVoice;
use App\Services\CompanyApiService;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Hash;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\UserPost;
use App\Http\Requests\UserPasswordPost;
use App\Models\User;
use App\Models\UserInfo;
use App\Models\MstStore;
use App\Models\MstCompany;
use App\Models\CustomItem;
use App\Models\CustomContent;
use App\Models\RelationCustomItem;

use GuzzleHttp\Psr7;

class UserController extends Controller
{
    private $userInfo;

    public function __construct()
    {
        $this->middleware('auth')->except(['index', 'show']);
    }

    /**
     * イベント画面の表示
     * @return string
     */
    public function show()
    {
        $user = Auth::user();
        $data['user'] = $user;

        if ($user->isWebmaster() || $user->isStaff()) {
            return redirect()->route("staff-edit-me");
        }

        return view('admin.pages.user', $data);
    }

    public function listUser(Request $request)
    {
        $user = $this->checkRole($request);
        if ($user->role != 1) {
            return back();
        }

        $data['user'] = $user;
        $data['type'] = $request->type;
        $data['staff'] = [];

        $store_list = MstStore::getDataAll($user->company_id);
        // スタッフを取得
        foreach($store_list as $row) {
            $tmp_list = User::getDataStaff($user->company_id, $row['code'], $request);
            foreach($tmp_list as &$item) {
                $info = UserInfo::getDataById($item['id']);
                if(empty($info)){
                    $item['fullname'] = $user->name;
                }else{
                    $item['fullname'] = $info->last_name . $info->first_name;
                }
                $item['store_name'] = isset($row['name'])? $row['name']: "-";
                $item['employee_number'] = isset($info['employee_number'])? $info['employee_number']: "";
                $item['department'] = isset($info->department)? $info->department: "-";
                $item['position'] = isset($info->position)? $info->position: "-";
                $item['disp'] = isset($info->disp)? $info->disp: "-";
                if(!empty($info['file_path'])){
                    $item['file_path'] = str_replace('public', '/storage', $info['file_path']);
                }
            }
            //dd(count($tmp_list));
            $data['staff'][] = $tmp_list;
        }

        return view('admin.pages.user-list', $data);
    }

    public function createUser(Request $request) {
        $user = $this->checkRole($request);

        //if($request->type != 2 && $request->type != 3) {
        //print("不正なアクセスです。");
        //exit;
        //}
        $data['user'] = $user;
        $data['type'] = $request->type;

        // カスタム項目を取得
        $customs = CustomItem::getData($user->company_id);
        $data['customs'] = $customs;

        // 店舗を取得
        $data['store'] = MstStore::getDataAll($user->company_id);
        return view('admin.pages.user-regist', $data);
    }

    public function create(UserPost $request, CompanyApiService $apiService) {
        $user = $this->checkRole($request);

        $all = $request->all();

        // 同一会社の最大社員番号を取得
        $max_id = UserInfo::where('company_id', '=', $user->company_id)->max('employee_number');
        $max_order = UserInfo::where('company_id', '=', $user->company_id)->max('order');

        $obj_user = new User;
        $user_data = [];
        $user_data['role'] = $request->role;
        $user_data['company_id'] = $user->company_id;
        $user_data['store_id'] = $request->store;
        $user_data['name'] = $request->last_name . $request->first_name;
        $user_data['email'] = $request->email;
        $user_data['password'] = Hash::make($request->password);

        // ユーザー情報の登録
        $res = $obj_user->fill($user_data)->save();

        $obj_detail = new UserInfo;
        $detail_data = [];
        $detail_data['id'] = $obj_user->id;
        $detail_data['company_id'] = $user->company_id;
        $detail_data['employee_number'] = $max_id+1;
        $detail_data['last_name'] = $request->last_name;
        $detail_data['first_name'] = $request->first_name;
        $detail_data['last_name_kana'] = $request->last_name_kana;
        $detail_data['first_name_kana'] = $request->first_name_kana;
        $detail_data['store'] = $request->store;
        $detail_data['department'] = $request->department;
        $detail_data['position'] = $request->position;
        $detail_data['birth_month'] = $request->birth_month;
        $detail_data['birth_day'] = $request->birth_day;
        $detail_data['blood_type'] = $request->blood;
        $detail_data['certification'] = $request->certification;
        $detail_data['college'] = $request->college;
        $detail_data['residence'] = $request->residence;
        $detail_data['disp'] = 0;
        $detail_data['order'] = $max_order+1;

        $result = $obj_detail->fill($detail_data)->save();

        if(isset($request->file_single_input)) {
            $extension = $request->file_single_input->getClientOriginalExtension();
            $image_url = $request->file_single_input->storeAs('public/company_'.$user->company_id.'/staff', 'staff_image_'.$detail_data['employee_number'].'.'. $extension);
            if($user->company_id == 1){
                $this->uploadRemoteMic($image_url);
            }
            UserInfo::where('company_id', $user->company_id)
                ->where('employee_number', $obj_detail->employee_number)
                ->update(['file_path' => $image_url]);
        }

        // カスタム項目の登録
        for($no = 1; $no <= config('const.ITEM_NUM'); $no++) {
            if($request->{'custom'.$no} || isset($request->{'file_single_input'.($no+1)})) {
                $obj_custom = new RelationCustomItem;
                $custom = [];
                $custom['company_id'] = $user->company_id;
                $custom['user_id'] = $obj_detail->employee_number;
                $custom['code'] = $no;
                $custom['memo'] = $request->{'custom'.$no} ?? '';
                $custom['file_name'] = '';
                if(isset($request->{'file_single_input'.($no+1)})) {
                    $extension = $request->{'file_single_input'.($no+1)}->getClientOriginalExtension();
                    $image_url = $request->{'file_single_input'.($no+1)}->storeAs('public/company_'.$user->company_id.'/staff', 'staff_image_q'.$no.'_'.$obj_user->id.'.'. $extension);
                    if($user->company_id == 1){
                        $this->uploadRemoteMic($image_url);
                    }
                    $custom['file_path'] = $image_url;
                }
                $res = $obj_custom->fill($custom)->save();
            }
        }

        if($result) {
            $data = User::where('id', $obj_user->id)->first();
            $data['user_info'] = UserInfo::getDataByNumber($obj_detail->employee_number, $user->company_id);
            $data['custom_item'] = RelationCustomItem::where('user_id', $obj_detail->employee_number)->where('company_id', $user->company_id)->get();

            $apiService->registerStaff($data);
            $URL = url('');
            header('Location: '.$URL.'/admin/staffEdit/'.$obj_detail->employee_number);
            die();
        }
    }


    public function editUser(Request $request) {
        $user = $this->checkRole($request);
        if($user->role > 1) {
            return redirect('/admin/staffList');
        }
        $data['user'] = $user;
        $data['type'] = $request->type;

        // 店舗を取得
        $data['store'] = MstStore::getDataAll($user->company_id);
        $user_info = UserInfo::getDataByNumber($request->id, $user->company_id);
        $data['user_info'] = User::getDataStaffById($user_info->id);

        $user_info['file_path'] = str_replace('public', '/storage', $user_info ['file_path']);
        $data['user_detail'] = $user_info;

        // カスタム項目を取得
        $customs = CustomItem::getData($user->company_id);
        foreach($customs as &$row) {
            $custom_anser = RelationCustomItem::getItem($request->id, $row->code, $user->company_id);
            if($custom_anser != null){
                $row->ans = $custom_anser['memo'];
                $row->file_path = str_replace('public', '/storage', $custom_anser['file_path']);
            }
        }
        $data['customs'] = $customs;

        return view('admin.pages.user-edit', $data);
    }

    public function edit(UserPost $request, CompanyApiService $apiService) {

        $URL = url('');
        $user = $this->checkRole($request);
        $data['user'] = $user;
        $data['type'] = $request->type;

        // 店舗を取得
        $data['store'] = MstStore::getDataAll($user->company_id);

        $detail_data = [];
        $detail_data['last_name'] = $request->last_name;
        $detail_data['first_name'] = $request->first_name;
        $detail_data['last_name_kana'] = $request->last_name_kana;
        $detail_data['first_name_kana'] = $request->first_name_kana;
        $detail_data['store'] = $request->store;
        $detail_data['department'] = $request->department;
        $detail_data['position'] = $request->position;
        $detail_data['birth_month'] = $request->birth_month;
        $detail_data['birth_day'] = $request->birth_day;
        $detail_data['blood_type'] = $request->blood;
        $detail_data['certification'] = $request->certification;
        $detail_data['college'] = $request->college;
        $detail_data['residence'] = $request->residence;

        if(isset($request->del_photo)) {
            $user_info = UserInfo::getDataByNumber($request->id, $user->company_id);
            Storage::delete($user_info->file_path);
            $detail_data['file_path'] = null;
        }
        $result = UserInfo::where('company_id', $user->company_id)->where('employee_number', $request->id)->update($detail_data);

        $user_info = UserInfo::getDataByNumber($request->id, $user->company_id);

        // ユーザー詳細情報の更新
        $detail_data = [];
        $detail_data['store_id'] = $request->store;
        if ($user->role == 1) {
            $detail_data['role'] = $request->role;
        }
        $detail_data['name'] = $request->last_name . $request->first_name;
        if($request->password) {
            $detail_data['password'] = Hash::make($request->password);
        }
        if($request->email){
            $detail_data['email'] = $request->email;
        }

        User::where('id', $user_info->id)->update($detail_data);

        if(isset($request->file_single_input)) {
            $extension = $request->file_single_input->getClientOriginalExtension();
            $image_url = $request->file_single_input->storeAs('public/company_'.$user->company_id.'/staff', 'staff_image_'.$request->id.'.'. $extension);
            UserInfo::where('company_id', $user->company_id)->where('employee_number', $request->id)->update(['file_path' => $image_url]);
            if($user->company_id == 1){
                $this->uploadRemoteMic($image_url);
            }
        }

        //RelationCustomItem::where('company_id', '=', $user->company_id)->where('user_id', '=', $request->id)->delete();
        for($no = 1; $no <= config('const.ITEM_NUM'); $no++) {
            if($request->{'custom'.$no} || isset($request->{'file_single_input'.($no+1)}) || isset($request->{'del_photo'.($no+1)}) || isset($request->{'custom_file_path'.($no+1)})) {
                $obj_custom = RelationCustomItem::where('company_id', '=', $user->company_id)
                    ->where('code', $no)
                    ->where('user_id', '=', $request->id)
                    ->first();
                if (!isset($obj_custom)){
                    $obj_custom = new RelationCustomItem;
                }
                $custom = [];
                $custom['company_id'] = $user->company_id;
                $custom['user_id'] = $request->id;
                $custom['code'] = $no;
                $custom['memo'] = $request->{'custom'.$no} ?? '';
                $custom['file_name'] = '';
                $custom['file_path'] = $request->{'custom_file_path'.($no+1)};
                if (isset($request->{'del_photo'.($no+1)})){
                    $custom['file_path'] = null;
                }
                if(isset($request->{'file_single_input'.($no+1)})) {
                    $extension = $request->{'file_single_input'.($no+1)}->getClientOriginalExtension();
                    $image_url = $request->{'file_single_input'.($no+1)}->storeAs('public/company_'.$user->company_id.'/staff', 'staff_image_q'.$no.'_'.$user_info->id.'.'. $extension);
                    if($user->company_id == 1){
                        $this->uploadRemoteMic($image_url);
                    }
                    $custom['file_path'] = $image_url;
                }
                $res = $obj_custom->fill($custom)->save();
            }else {
                RelationCustomItem::where('company_id', '=', $user->company_id)
                    ->where('code', $no)
                    ->where('user_id', '=', $request->id)
                    ->delete();
            }
        }
        $request->session()->flash('message', '登録・保存しました');

        $data = User::where('id', $user_info->id)->first();
        $data['user_info'] = UserInfo::getDataByNumber($request->id, $user->company_id);
        $data['custom_item'] = RelationCustomItem::where('user_id', $request->id)->where('company_id', $user->company_id)->get();

        $apiService->editStaff($request->id, $data);

        return redirect("/admin/staffEdit/".$request->id);
    }

    public function editUserMe(Request $request) {
        $user = $this->checkRole($request);
        $data['user'] = $user;
        $data['type'] = $request->type;

        // 店舗を取得
        $data['store'] = MstStore::getDataAll($user->company_id);

        $user_info = UserInfo::getDataById($user->id);
        $data['user_info'] = User::getDataStaffById($user_info->id);

        $user_info['file_path'] = str_replace('public', '/storage', $user_info ['file_path']);
        $data['user_detail'] = $user_info;

        // カスタム項目を取得
        $customs = CustomItem::getData($user->company_id);
        foreach($customs as &$row) {
            $custom_anser = RelationCustomItem::getItem($user_info->employee_number, $row->code, $user->company_id);
            $row->file_path = str_replace('public', '/storage', $custom_anser['file_path']);
            $row->ans = $custom_anser['memo'] ?? '';
        }
        $data['customs'] = $customs;

        return view('admin.pages.user-edit', $data);
    }

    public function editMe(UserPost $request) {

        $URL = url('');
        $user = $this->checkRole($request);
        $data['user'] = $user;
        $data['type'] = $request->type;

        // 店舗を取得
        $data['store'] = MstStore::getDataAll($user->company_id);

        $detail_data = [];
        $detail_data['last_name'] = $request->last_name;
        $detail_data['first_name'] = $request->first_name;
        $detail_data['last_name_kana'] = $request->last_name_kana;
        $detail_data['first_name_kana'] = $request->first_name_kana;
        $detail_data['store'] = $request->store;
        $detail_data['department'] = $request->department;
        $detail_data['position'] = $request->position;
        $detail_data['birth_month'] = $request->birth_month;
        $detail_data['birth_day'] = $request->birth_day;
        $detail_data['blood_type'] = $request->blood;
        if(isset($request->del_photo)) {
            $user_info = UserInfo::getDataByNumber($user->id, $user->company_id);
            Storage::delete($user_info->file_path);
            $detail_data['file_path'] = null;
        }
        $result = UserInfo::where('company_id', $user->company_id)->where('employee_number', $user->id)->update($detail_data);

        $user_info = UserInfo::getDataByNumber($user->id, $user->company_id);

        // ユーザー詳細情報の更新
        $detail_data = [];
        $detail_data['store_id'] = $request->store;
        User::where('id', $user_info->id)->update($detail_data);



        if(isset($request->file_single_input)) {
            $extension = $request->file_single_input->getClientOriginalExtension();
            $image_url = $request->file_single_input->storeAs('public/staff', 'staff_image_'.$user->id.'.'. $extension);
            UserInfo::where('company_id', $user->company_id)->where('employee_number', $user->id)->update(['file_path' => $image_url]);
            if($user->company_id == 1){
                $this->uploadRemoteMic($image_url);
            }
        }


        RelationCustomItem::where('company_id', '=', $user->company_id)->where('user_id', '=', $user->id)->delete();
        for($no = 1; $no <= config('const.ITEM_NUM'); $no++) {
            if($request->{'custom'.$no}) {
                $obj_custom = new RelationCustomItem;
                $custom = [];
                $custom['company_id'] = $user->company_id;
                $custom['user_id'] = $user->id;
                $custom['code'] = $no;
                $custom['memo'] = $request->{'custom'.$no};
                $custom['file_name'] = '';
                $res = $obj_custom->fill($custom)->save();
            }
        }

        $URL = url('');
        header('Location: '.$URL.'/admin/userInfo');
        die();
    }

    public function customProf(Request $request) {
        $user = $this->checkRole($request);
        $data['user'] = $user;
        $items = CustomItem::getData($user->company_id);
        $num = 1;
        foreach($items as $item) {
            $data['item'.$num] = $item->name;
            $num++;
        }

        $contents = CustomContent::getData($user->company_id);
        $num = 1;
        foreach($contents as $item) {
            $data['custom_type'.$num] = $item->type;
            $data['custom_name'.$num] = $item->name;
            $data['custom_contents'.$num] = $item->contents;
            $num++;
        }

        return view('admin.pages.user-custom-prof', $data);
    }

    public function registCustom(Request $request, CompanyApiService $apiService) {
        $user = $this->checkRole($request);

        // カスタム項目の登録
        $item = new CustomItem;
        $item::where('company_id', '=', $user->company_id)->delete();
        for($i = 1; $i <= 15; $i++) {
            $data = [];
            $data['company_id'] = $user->company_id;
            $data['code'] = $i;
            $data['name'] = !empty($request->{'custom'.$i})?$request->{'custom'.$i}: null;
            $item = new CustomItem;
            $res = $item->fill($data)->save();
        }
        $apiService->registCustom(['data' => CustomItem::all()]);


        // 独自項目の登録
        /*
        $item = new CustomContent;
        $item::where('company_id', '=', $user->company_id)->delete();
        for($i = 1; $i < 6; $i++) {
            $data = [];
            $data['company_id'] = $user->company_id;
            $data['code'] = $i;
            $data['type'] = !empty($request->{'custom_type'.$i})?$request->{'custom_type'.$i}: null;
            $data['name'] = !empty($request->{'custom_name'.$i})?$request->{'custom_name'.$i}: null;
            $data['contents'] = !empty($request->{'custom_contents'.$i})?$request->{'custom_contents'.$i}: null;
            $item = new CustomContent;
            $res = $item->fill($data)->save();
        }*/
        $request->session()->flash('message_modal', 'プロフィール項目を変更・保存しました。');

        return back();
    }

    public function originalProf(Request $request) {
        $user = $this->checkRole($request);
        $data['user'] = $user;
        $items = CustomItem::getData($user->company_id);
        $num = 1;
        foreach($items as $item) {
            $data['item'.$num] = $item->name;
            $num++;
        }

        $contents = CustomContent::getData($user->company_id);
        $num = 1;
        foreach($contents as $item) {
            $data['custom_type'.$num] = $item->type;
            $data['custom_name'.$num] = $item->name;
            $data['custom_contents'.$num] = $item->contents;
            $num++;
        }

        return view('admin.pages.user-original-prof', $data);
    }

    public function registOriginal(Request $request, CompanyApiService $apiService) {
        $user = $this->checkRole($request);

        // カスタム項目の登録
        /*$item = new CustomItem;
        $item::where('company_id', '=', $user->company_id)->delete();
        for($i = 1; $i < 7; $i++) {
            $data = [];
            $data['company_id'] = $user->company_id;
            $data['code'] = $i;
            $data['name'] = !empty($request->{'custom'.$i})?$request->{'custom'.$i}: null;
            $item = new CustomItem;
            $res = $item->fill($data)->save();
        }*/

        // 独自項目の登録
        $item = new CustomContent;
        $item::where('company_id', '=', $user->company_id)->delete();
        for($i = 1; $i < 11; $i++) {
            $data = [];
            $data['company_id'] = $user->company_id;
            $data['code'] = $i;
            $type = !empty($request->{'custom_type'.$i})?$request->{'custom_type'.$i}: null;
            if (is_null($type)) {
                continue;
            }
            $data['type'] = $type;
            $data['name'] = !empty($request->{'custom_name'.$i})?$request->{'custom_name'.$i}: null;
            $data['contents'] = !empty($request->{'custom_contents'.$i})?$request->{'custom_contents'.$i}: null;
            $item = new CustomContent;
            $res = $item->fill($data)->save();
        }

        $postData = $request->all();
        $postData['company_id'] =  $user->company_id;
        $apiService->registOriginal($postData);

        $request->session()->flash('message_modal', 'オリジナル項目を変更・保存しました。');
        return back();
    }

    public function customVoice(Request $request) {
        $user = $this->checkRole($request);
        $data['user'] = $user;
        $items = CustomVoice::getData($user->company_id);
        $num = 1;
        foreach($items as $item) {
            $data['item'.$num] = $item->name;
            $num++;
        }
        $contents = CustomVoice::getData($user->company_id);
        $num = 1;
        foreach($contents as $item) {
            $data['custom_type'.$num] = $item->type;
            $data['custom_name'.$num] = $item->name;
            $data['custom_contents'.$num] = $item->contents;
            $num++;
        }
        return view('admin.pages.user-custom-voice', $data);
    }

    public function registCustomVoice(Request $request, CompanyApiService $apiService) {
        $user = $this->checkRole($request);
        // カスタム項目の登録
        $item = new CustomVoice();
        $item::where('company_id', '=', $user->company_id)->delete();
        for($i = 1; $i <= config('const.ITEM_NUM'); $i++) {
            $data = [];
            $data['company_id'] = $user->company_id;
            $data['code'] = $i;
            $data['type'] = !empty($request->{'type'.$i})?(int)$request->{'type'.$i}: 0;
            $data['contents'] = !empty($request->{'contents'.$i})?$request->{'contents'.$i}: null;
            $data['name'] = !empty($request->{'name'.$i})?$request->{'name'.$i}: null;
            $item = new CustomVoice;
            $res = $item->fill($data)->save();
        }

        $apiService->registCustomVoice(['data' => CustomVoice::all()]);

        $request->session()->flash('message_modal', 'プロフィール項目を変更・保存しました。');
        return back();
    }


    public function checkRole(Request $request) {
        $user = Auth::user($request);
        //if($user->role > 1 || $request->type == 1 || $request->type > 3) {
        //print("不正なアクセスです。");
        //exit;
        //}
        return $user;
    }

    public function registPasswordForm(Request $request) {
        $user = $this->checkRole($request);

        return view('admin.pages.user-password');
    }

    public function registPassword(UserPasswordPost $request) {
        $user = Auth::user();

        // ユーザー詳細情報の更新
        $detail_data = [];
        $detail_data['password'] = Hash::make($request->password);
        $res = User::where('id', $user->id)->update($detail_data);

        if ($res) {
            return redirect('/admin/adminRegist')->with('message', '登録しました。');
        }
    }

    public function sort(Request $request, CompanyApiService $apiService)
    {
        if($request->ajax()){
            $userList = $request->get("user_list");
            foreach ($userList as $user){
                $staff = User::findOrFail($user["id"]);
                $staff->update(["order" => $user["order"]]);
                $staffInfo = UserInfo::findOrFail($user["id"]);
                $staffInfo->update(["order" => $user["order"]]);
            }
            $apiService->orderStaff(['user_list' => $userList]);
        }
    }
    public static function uploadRemoteMic($file_path)
    {
        $ar_folder = explode('/', $file_path);
        unset($ar_folder[count($ar_folder) - 1]);
        $folder = implode('/', $ar_folder);
        $folder = str_replace('public', 'storage', $folder);


        $url = env("URL_MIC_EXPORT", "");
        $path = storage_path("app".DIRECTORY_SEPARATOR.$file_path);

        try {
            $client = new Client(['verify' => false]);
            $r = $client->request('POST', $url, [
                'multipart' => [
                    [
                        'name'     => 'file_name',
                        'contents' => Psr7\Utils::tryFopen($path, 'r'),
                    ],
                    [
                        'name'     => 'folder',
                        'contents' => "/".$folder."/",
                    ],
                ]
            ]);

            $code = $r->getStatusCode();
            $body = $r->getBody();
            $remainingBytes = $body->getContents();
            //dd($remainingBytes);
        } catch (\Error $error) {
            var_dump($error);
        }
    }
}
