<?php

namespace App\Http\Controllers\Admin;

use App\Http\Requests\TownVoicePost;
use App\Models\MstPrefecture;
use App\Models\MstCity;
use App\Models\MstTown;
use App\Models\CustomVoice;
use App\Models\MstStore;
use App\Models\User;
use App\Models\UserInfo;
use App\Models\TownVoice;
use App\Services\CompanyApiService;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Cookie;

class TownVoiceController extends Controller
{
    public function index(Request $request){
        $cookie = Cookie::forget('townvoice_params');
        $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 = TownVoice::getData($request->all());
            foreach ($voices as $voice){
                $data['voice_list'][$voice->store][] = $voice;
            }
            $request->merge(['url_search' => url()->current()]);
            $cookie = Cookie::queue(Cookie::make('townvoice_params', json_encode($request->all()), 10));
        }


        // 都道府県マスターを取得
        $data['pref'] = MstPrefecture::getData();
        $defaultPrefCode = array_get(array_first($data['pref']), 'code');
        if (auth()->user()->company_id === 1) {
            $city = MstCity::getData($defaultPrefCode, null, auth()->user()->company_id);
            $data['city'] = $city;
        } else {
            $data['city'] = MstCity::getData($defaultPrefCode, null, auth()->user()->company_id);
        }
        $data['town'] = [];
        $params = $request->all();
        if(isset($params['address1']) && isset($params['address2'])){
            $data['town'] = MstTown::getData($params['address1'], $params['address2']);
        }

        return view('admin.pages.town-voice', $data)->withCookie($cookie);
    }

    // create：新規登録画面表示
    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'] = [];
        //住所を取得
        $data['pref'] = MstPrefecture::getData();
        $user = Auth::user();
        $defaultPrefCode = array_get(array_first($data['pref']), 'code');
        if ($user->company_id === 1) {
                $city = MstCity::getData($defaultPrefCode, null, $user->company_id);
                $num = count($city);
                $data['city'] = $city;
            } else {
                $data['city'] = MstCity::getData($defaultPrefCode, null, $user->company_id);
            }
            $data['town'] = '';
            if(!empty($data['pref'])){
                $data['town'] = MstTown::getData($data['pref'][0]['code'], $data['city'][0]['code']);
            }

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

    // store：登録処理
    public function store(TownVoicePost $request, CompanyApiService $apiService){
        $user = auth()->user();
        $townVoice = new TownVoice();
        $townVoice->name = $request->nickname;
        $townVoice->store = $request->store;
        $townVoice->company_id = $user->company_id;
        $townVoice->staff = $request->staff;
        $townVoice->address1 = $request->address1;
        $townVoice->address2 = $request->address2;
        $townVoice->address3 = $request->address3;
        $townVoice->gender = $request->gender;
        $townVoice->age = $request->age;
        $townVoice->family_number = $request->family_number;
        $townVoice->child_number = $request->child_number;
        $townVoice->good_point = $request->good_point;
        $townVoice->weak_point = $request->weak_point;
        // $townVoice->photo = $request->photo;
        // ユーザー情報の登録
        $townVoice->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_'.$townVoice->id.'.'. $extension);
            $townVoice->photo = $image_url;
            $townVoice->save();
            if($user->company_id == 1){
                $this->uploadRemoteMic($image_url);
            }
        }
        $request->session()->flash('message', '登録・保存しました');

        $apiService->registTownVoice($townVoice);

        return redirect("/admin/townVoiceEdit/".$townVoice->id);
    }

    // edit：編集画面表示
    public function edit(Request $request, $id){

        $user = auth()->user();
        if ($user->isStaff() || ($user->isWebMaster() && $user->company_id !== 3)) {
            return back();
        }
        $townVoice = TownVoice::find($id);
        //画像パスを取得（不要、消して大丈夫なら消す）
        $townVoice->file_path = str_replace('public', '/storage', $townVoice['photo']);
        $data['voice_info'] = $townVoice;
        $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, $townVoice->store);

         //住所を取得
        $data['pref'] = MstPrefecture::getData();
        if(!empty($data['pref'])) {
            $pref = !empty($townVoice->address1) ? $townVoice->address1 : $data['pref'][0]['code'];
        }
        $user = Auth::user();
        $defaultPrefCode = array_get(array_first($data['pref']), 'code');
        if ($user->company_id === 1) {
            $city = MstCity::getData($defaultPrefCode, null, $user->company_id);
            $num = count($city);
            $data['city'] = $city;
        } else {
            $data['city'] = MstCity::getData($defaultPrefCode, null, $user->company_id);
        }

        $city = !empty($townVoice->address2) ? $townVoice->address2 : $data['city'][0]['code'];
        $data['town'] = '';
        if(isset($pref)){
            $data['town'] = MstTown::getData($pref, $city);
            $data['city'] = MstCity::getData($pref, null, $user->company_id);
        }

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

    // update：更新処理
    public function update(TownVoicePost $request, $id, CompanyApiService $apiService){
        $user = auth()->user();
        $townVoice = TownVoice::findOrFail($id);
        $townVoice->name = $request->nickname;
        $townVoice->store = $request->store;
        $townVoice->company_id = $user->company_id;
        $townVoice->staff = $request->staff;
        $townVoice->address1 = $request->address1;
        $townVoice->address2 = $request->address2;
        $townVoice->address3 = $request->address3;
        $townVoice->gender = $request->gender;
        $townVoice->age = $request->age;
        $townVoice->family_number = $request->family_number;
        $townVoice->child_number = $request->child_number;
        $townVoice->good_point = $request->good_point;
        $townVoice->weak_point = $request->weak_point;
        //$townVoice->photo = $request->photo;
        $townVoice->save();

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

        $apiService->editTownVoice($id, $townVoice);

        return redirect("/admin/townVoiceEdit/".$townVoice->id);
    }

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

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

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


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

        $apiService->deleteTownVoice($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);
        }
    }
}
