<?php

namespace App\Http\Controllers\Admin;

use App\Http\Requests\VoicePost;
use App\Models\CustomVoice;
use App\Models\MstStore;
use App\Models\User;
use App\Models\UserInfo;
use App\Models\Voice;
use App\Services\CompanyApiService;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;

class VoiceController extends Controller
{
    public function index(Request $request){
        $user = auth()->user();
        if ($user->isStaff() || ($user->isWebMaster() && $user->company_id !== 3)) {
            return back();
        }
        $staffs[] = [
            'code' => '',
            'name' => '未選択'
        ];
        $data['user'] = $user;
        $data['store'] = MstStore::getDataAll($user->company_id);
        $data['staffs'] = array_merge($staffs, User::getDataByAll($user->company_id));
        $data['voice_list'] = [];
        if ($request->method() === 'POST'){
            $voices = Voice::getData($request->all());
            foreach ($voices as $voice){
                $data['voice_list'][$voice->store][] = $voice;
            }
        }
        return view('admin.pages.voice', $data);
    }

    public function create(Request $request){
        $user = auth()->user();
        $data['user'] = $user;
        // カスタム項目を取得
        $customs = CustomVoice::getData($user->company_id);
        foreach ($customs as $custom){
            $contentArr = explode(',',$custom->contents ?? "");
            $options = [];
            foreach ($contentArr as $index=>$content){
                $options[] = [
                    'code' => $index,
                    'name' => $content
                ];
            }
            $custom->options = $options;
        }
        $data['customs'] = $customs;
        // 店舗を取得
        $data['store'] = MstStore::getDataAll($user->company_id);
        $data['staffs'] = [];
        return view('admin.pages.voice-regist', $data);
    }

    public function store(VoicePost $request, CompanyApiService $apiService){
        $user = auth()->user();
        $voice = new Voice();
        $voice->name = $request->nickname;
        $voice->title = $request->title;
        $voice->store = $request->store;
        $voice->company_id = $user->company_id;
        $voice->staff = $request->staff;
        $voice->text1 = $request->text1;
        $voice->text2 = $request->text2;
        $voice->text3 = $request->text3;
        $voice->text4 = $request->text4;
        $voice->text5 = $request->text5;
        $voice->text6 = $request->text6;
        $voice->text7 = $request->text7;
        $voice->text8 = $request->text8;
        $voice->text9 = $request->text9;
        $voice->text10 = $request->text10;
        $voice->text11 = $request->text11;
        $voice->text12 = $request->text12;
        $voice->text13 = $request->text13;
        $voice->text14 = $request->text14;
        $voice->text15 = $request->text15;
        $voice->comment = $request->comment;
        $voice->photo = $request->photo;
        // ユーザー情報の登録
        $voice->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.'/voice', 'voice_image_'.$voice->id.'.'. $extension);
            $voice->photo = $image_url;
            $voice->save();
            if($user->company_id == 1){
                $this->uploadRemoteMic($image_url);
            }
        }
        $request->session()->flash('message', '登録・保存しました');

        $apiService->registVoice($voice);

        return redirect("/admin/voiceEdit/".$voice->id);
    }

    public function edit(Request $request, $id){
        $user = auth()->user();
        if ($user->isStaff() || ($user->isWebMaster() && $user->company_id !== 3)) {
            return back();
        }
        $voice = Voice::find($id);
        $voice->file_path = str_replace('public', '/storage', $voice['photo']);
        $data['voice_info'] = $voice;
        $data['user'] = $user;
        $customs = CustomVoice::getData($user->company_id);
        foreach ($customs as $custom){
            $contentArr = explode(',',$custom->contents ?? "");
            $options = [];
            foreach ($contentArr as $index=>$content){
                $options[] = [
                    'code' => (string)$index,
                    'name' => $content
                ];
            }
            $custom->options = $options;
        }
        $data['customs'] = $customs;
        $data['store'] = MstStore::getDataAll($user->company_id);
        $data['staffs'] = User::getDataByStoreId($user->company_id, $voice->store);

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

    public function update(VoicePost $request, $id, CompanyApiService $apiService){
        $user = auth()->user();
        $voice = Voice::findOrFail($id);
        $voice->name = $request->nickname;
        $voice->title = $request->title;
        $voice->store = $request->store;
        $voice->company_id = $user->company_id;
        $voice->staff = $request->staff;
        $voice->text1 = $request->text1;
        $voice->text2 = $request->text2;
        $voice->text3 = $request->text3;
        $voice->text4 = $request->text4;
        $voice->text5 = $request->text5;
        $voice->text6 = $request->text6;
        $voice->text7 = $request->text7;
        $voice->text8 = $request->text8;
        $voice->text9 = $request->text9;
        $voice->text10 = $request->text10;
        $voice->text11 = $request->text11;
        $voice->text12 = $request->text12;
        $voice->text13 = $request->text13;
        $voice->text14 = $request->text14;
        $voice->text15 = $request->text15;
        //$voice->photo = $request->photo;
        $voice->comment = $request->comment;
        $voice->save();

        if(isset($request->del_photo)) {
            Storage::delete($voice->photo);
            $voice->photo = null;
            $voice->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.'/voice', 'voice_image_'.$voice->id.'.'. $extension);
            $voice->photo = $image_url;
            $voice->save();
            if($user->company_id == 1){
                $this->uploadRemoteMic($image_url);
            }
        }
        $request->session()->flash('message', '登録・保存しました');

        $apiService->editVoice($id, $voice);

        return redirect("/admin/voiceEdit/".$voice->id);
    }

    public function changeKokai(Request $request, CompanyApiService $apiService){
        $user = auth()->user();
        $voice = Voice::findOrFail($request->id);
        $voice->kokai = $request->check;
        $voice->save();

        $apiService->changeStatusVoice($request->id, $voice);

        return response()->json([]);
    }


    public function destroy(Request $request, CompanyApiService $apiService){
        Voice::where('id', $request->id)->delete();

        $apiService->deleteVoice($request->id);

        return response()->json([]);
    }


    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);
        }
    }
}
