<?php

namespace App\Http\Controllers;

use App\Contact;
use App\Events\NotifyEvent;
use App\Notify;
use App\Product;
use App\ProductDetail;
use App\User;
use Illuminate\Http\Request;
use Validator;
use Mail;

class ContactController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'id'           => [ 'required' ],
            'type'         => [ 'required' ],
            'name'         => [ 'required' ],
            'email'        => [ 'required' ],
            'phone_number' => [ 'required' ],
            'content'      => [ 'required' ],
        ]);
        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);

        $params = $request->all();
        $user = User::where('id', $params['id'])->where('is_activated', true)->where('is_deleted', false)->first();
        if (!$user || ($user->id != auth('api')->user()->id)) {
            return response()->json([ 'error' => 'User not found' ], 404);
        }

        Contact::create([
            'type'          => $params['type'],
            'name'          => $params['name'],
            'first_name'    => $params['name'],
            'last_name'     => $params['name'],
            'email'         => $params['email'],
            'phone_number'  => $params['phone_number'],
            'zip_code_1'    => $user->post_code,
            'prefectures'   => $user->city,
            'address'       => $user->address,
            'building_name' => $user->address2,
            'content'       => $params['content'],
            'user_id'       => $params['id'],
            'is_read'       => 0,
            'is_activated'  => 1,
            'created_at'    => date('Y-m-d H:i:s'),
            'updated_at'    => date('Y-m-d H:i:s')
        ]);

        $typeList = [ 'クリーニング保管サービスを希望する', '着物の修理サービスを依頼する', '着物の種類変更のお申し込み', 'その他の要件' ];
        $typeCode = 3;
        if (in_array($params['type'], [ 0, 1, 2, 3 ])) $typeCode = (int)$params['type'];

        $data = $params;
        $data['site'] = url("/");
        $data['first_name'] = $user->first_name;
        $data['last_name'] = $user->last_name;
        $data['full_name'] = $user->full_name;
        $data['email'] = $user->email;
        $data['phone_number'] = $user->phone_number;
        $data['address'] = $user->address;
        $data['type'] = $typeList[$typeCode];
        $data['content'] = $params['content'];
        $userEmail = $params['email'];

        try {
            //hunters2fujiyoshi@gmail.com
            Notify::create([
                'content'      => "[" . $data['full_name'] . "] just sent you a contact.",
                'module'       => 'contact',
                'item_content' => json_encode($data),
                'created_at'   => date('Y-m-d H:i:s'),
                'updated_at'   => date('Y-m-d H:i:s'),
            ]);
            event(new NotifyEvent());

            //admin
            Mail::send('emails.contact_admin', $data, function ($message) {
                $message->from(config('mail.from.address'), config('mail.from.name'));
                $message->to(config('settings.admin_email'));
                $message->subject("【" . config('mail.from.name') . "】お客様からメールフォームにお問合せがありました。");
            });
            logger("[Email] Sent admin contact email to: " . config('settings.admin_email'));

            //user
            Mail::send('emails.contact_user', $data, function ($message) use ($userEmail) {
                $message->from(config('mail.from.address'), config('mail.from.name'));
                $message->to($userEmail);
                $message->subject("【" . config('mail.from.name') . "】お問い合わせありがとうございました。");
            });
            logger("[Email] Sent user contact email to: " . $userEmail);
        } catch (\Exception $exception) {
            logger($exception->getMessage());
        } finally {
            return response()->json([ 'data' => [ 'status' => 'success', 'message' => __('contact.message.success') ] ], 200);
        }
    }

    public function storeSurvey(Request $request, $code)
    {
        $validator = Validator::make($request->all(), [
            'code'         => [ 'required' ],
            'first_name'   => [ 'required' ],
            'last_name'    => [ 'required' ],
            'email'        => [ 'required' ],
            'phone_number' => [ 'required' ],
        ]);

        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);

        $productDetail = ProductDetail::with('product', 'option_detail')->isPublished()->where('code', $code)->first();
        if (!$productDetail) return response()->json([ 'errors' => 'Product is invalid.' ], 403);

        $params = $request->all();
        $session1 = '指定なし';
        if ($params['schedule_request_1_session'] == '1' || $params['schedule_request_1_session'] == 1) {
            $session1 = '午前';
        } elseif ($params['schedule_request_1_session'] == '2' || $params['schedule_request_1_session'] == 2) {
            $session1 = '午後';
        }

        $session2 = '指定なし';
        if ($params['schedule_request_2_session'] == '1' || $params['schedule_request_2_session'] == 1) {
            $session2 = '午前';
        } elseif ($params['schedule_request_2_session'] == '2' || $params['schedule_request_2_session'] == 2) {
            $session2 = '午後';
        }

        $options = '';
        foreach ($productDetail->option_detail as $item) {
            $options .= ($options != '') ? ", " : "";
            $options .= $item->detail->option->name . ": " . $item->detail->name;
        }

        $saleCost = ceil(($productDetail->price / (100 - $productDetail->product->discount)) * 100);
        $tax = ceil(($productDetail->price + $productDetail->product->standard_construction_fee) * (10 / 100));
        $totalAmount = ceil($productDetail->price + $productDetail->product->standard_construction_fee + $tax + $productDetail->product->shipping_cost);

        $contact = Contact::create([
            'type'                              => 0,
            'name'                              => $params['first_name'] . " " . $params['last_name'],
            'first_name'                        => $params['first_name'],
            'last_name'                         => $params['last_name'],
            'email'                             => $params['email'],
            'phone_number'                      => $params['phone_number'],
            'zip_code_1'                        => $params['post_code_1'] . '-' . $params['post_code_2'],
            'prefectures'                       => $params['address'],
            'address'                           => $params['address2'],
            'building_name'                     => $params['address3'],
            'schedule_request_1_date'           => $params['schedule_request_1_date'],
            'schedule_request_1_session'        => $session1,
            'schedule_request_1_time'           => $params['schedule_request_1_time'],
            'schedule_request_2_date'           => $params['schedule_request_2_date'],
            'schedule_request_2_session'        => $session2,
            'schedule_request_2_time'           => $params['schedule_request_2_time'],
            'content'                           => $params['content'],
            'product_id'                        => $productDetail->product->id,
            'product_code'                      => $productDetail->code,
            'product_name'                      => $productDetail->product->name,
            'product_image'                     => $productDetail->product->image,
            'product_regular_price_from'        => $productDetail->product->regular_price_from,
            'product_regular_price_to'          => $productDetail->product->regular_price_to,
            'product_price_from'                => $productDetail->product->price_from,
            'product_price_to'                  => $productDetail->product->price_to,
            'product_discount'                  => $productDetail->product->discount,
            'product_sale_cost'                 => $saleCost,
            'product_price'                     => $productDetail->price,
            'product_standard_construction_fee' => $productDetail->product->standard_construction_fee,
            'product_tax'                       => $tax,
            'product_shipping_cost'             => $productDetail->product->shipping_cost,
            'product_total_amount'              => $totalAmount,
            'options'                           => $options,
            'zip_code_2'                        => $params['other_post_code_1'] . '-' . $params['other_post_code_2'],
            'other_address'                     => $params['other_address'],
            'other_address2'                    => $params['other_address2'],
            'other_address3'                    => $params['other_address3'],
            'user_id'                           => auth('api')->check() ? auth('api')->user()->id : null,
            'is_other_address'                  => ($params['is_other_address'] == true || $params['is_other_address'] == 'true') ? 1 : 0,
            'is_read'                           => 0,
            'is_activated'                      => 1,
            'created_at'                        => date('Y-m-d H:i:s'),
            'updated_at'                        => date('Y-m-d H:i:s')
        ]);

        $data = $params;
        $data['site'] = url("/");
        $data['first_name'] = $params['first_name'];
        $data['last_name'] = $params['last_name'];
        $data['full_name'] = $params['first_name'] . " " . $params['last_name'];
        $data['email'] = $params['email'];
        $data['phone_number'] = $params['phone_number'];
        $data['content'] = $params['content'];
        $userEmail = $params['email'];

        try {
            Notify::create([
                'content'      => "[" . $data['full_name'] . "] just sent you a survey contact",
                'module'       => 'survey',
                'item_id'      => $contact->id,
                'item_content' => json_encode($data),
                'created_at'   => date('Y-m-d H:i:s'),
                'updated_at'   => date('Y-m-d H:i:s'),
            ]);
            event(new NotifyEvent());

            //admin
            /*Mail::send('emails.contact_admin', $data, function ($message) {
                $message->from(config('mail.from.address'), config('mail.from.name'));
                $message->to(config('settings.admin_email'));
                $message->subject("【" . config('mail.from.name') . "】お客様からメールフォームにお問合せがありました。");
            });
            logger("[Email] Sent admin contact email to: " . config('settings.admin_email'));*/

            //user
            /*Mail::send('emails.contact_user', $data, function ($message) use ($userEmail) {
                $message->from(config('mail.from.address'), config('mail.from.name'));
                $message->to($userEmail);
                $message->subject("【" . config('mail.from.name') . "】お問い合わせありがとうございました。");
            });
            logger("[Email] Sent user contact email to: " . $userEmail);*/
        } catch (\Exception $exception) {
            logger($exception->getMessage());
        } finally {
            return response()->json([ 'data' => [ 'status' => 'success', 'message' => __('contact.message.success') ] ], 200);
        }
    }
}
