<?php

namespace App\Http\Controllers\Frontend;

use App\Components\Functions;
use App\Models\Amenity;
use App\Models\PostAmentitie;
use App\Models\PostImage;
use App\Models\PostNews;
use App\Models\Province;
use App\Models\TypePrice;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Image;

class PostNewsController extends Controller
{
    //
    public function index(Request $request)
    {
        if (!auth('backend')->check()) {
            return redirect('/tim-phong-2')->with('error', 'Bạn phải đăng nhập trước');
        }
        $amenities = Amenity::where('user_id', 0)->get();
        $typePost = \DB::table('post_news')
            ->select('post_type.id', 'post_type.name')
            ->rightJoin('post_type', 'post_news.type_id', '=', 'post_type.id')
            ->groupBy('post_type.id')
            ->get();
        return view('frontend3.post_news_2.index', compact('amenities', 'typePost'));
    }

    public function createPostNews(Request $request)
    {
        //thông tin chủ trọ
        if(auth('backend')->check()){
            $user_id = auth('backend')->user()->id;
        }
        $owner_name = $request->get('owner_name', null);
        $owner_phone = $request->get('owner_phone', null);
        $owner_email = $request->get('owner_email', null);
        //thông tin địa chỉ
        $province = $request->get('province', null);
        $district = $request->get('district', null);
        $ward = $request->get('ward', null);
        $address = $request->get('address', null);
        $lat = $request->get('lat', null);
        $lng = $request->get('lng', null);
        //thông tin bài đăng
        $type_post = $request->get('type_post', null);
        $title = $request->get('title', null);
        $description = $request->get('description', null);
        //ảnh phòng
        $images = $request->file('images_arr');
        //thông tin phòng
        $price = $request->get('price');
        $deposit = $request->get('deposit');
        $amount_people = $request->get('amount_people');
        $size = $request->get('size');
        $date_available = $request->get('date_available');
        $electricity_price = (int)$request->get('type_electric_price');

        $electricity_price_text = preg_replace('/[^0-9]/', '',$request->get('electricity_price_text', null));
        $water_price = $request-> get('type_water_price');
        $water_price_text =  preg_replace('/[^0-9]/', '',$request->get('water_price_text', null));
        $electric_unit = null;
        $water_unit = null;
        //tiện ích, nội quy
        $amenities = $request->get('amenities');
        $policy = $request->get('policy');


        $type_electric_price = null;
        $electric = null;
        $type_water_price = null;
        $water = null;
        $province_name = null;
        $district_name = null;
        $ward_name = null;

        try {
            \DB::beginTransaction();

            //electrict price
            if ($electricity_price != null) {
                if ($electricity_price == 1) {
                    $type_electric_price = PostNews::state_price;
                    $electric = 'Giá nhà nước';
                } elseif ($electricity_price == 2) {
                    $type_electric_price = PostNews::fluctuations_price;
                    $electric = 'Giá biến động';
                } elseif ($electricity_price == 3) {
                    $type_electric_price = PostNews::power_meter;
                    $electric = $electricity_price_text;
                    $electric_unit = '/Kwh';
                } elseif ($electricity_price == 4) {
                    $type_electric_price = PostNews::person;
                    $electric = $electricity_price_text;
                    $electric_unit = '/Người';
                }elseif ($electricity_price == 5){
                    $type_electric_price = PostNews::free;
                    $electric = 'Miễn phí';
                }

            }

            //water price
            if ($water_price != null) {
                if ($water_price == 1) {
                    $type_water_price = PostNews::state_price;
                    $water = 'Giá nhà nước';
                } elseif ($water_price == 2) {
                    $type_water_price = PostNews::fluctuations_price;
                    $water = 'Giá biến động';
                } elseif ($water_price == 3) {
                    $type_water_price = PostNews::power_meter;
                    $water = $water_price_text;
                    $water_unit = '/Khối';
                } elseif ($water_price == 4) {
                    $type_water_price = PostNews::person;
                    $water = $water_price_text;
                    $water_unit = '/Người';
                }elseif($water_price==5){
                    $type_water_price = PostNews::free;
                    $water = 'Miễn phí';
                }
            }
            //province_name
            if ($province != null) {
                $province_name = \DB::table('province')->where('provinceid', $province)->first()->name;
            }
            //district_name
            if ($district != null) {
                $district_name = \DB::table('district')->where('districtid', $district)->first()->name;
            }
            //ward_name
            if ($ward != null) {
                $ward_name = \DB::table('ward')->where('wardid', $ward)->first()->name;
            }

            if (empty($lat) || empty($lng)) {
                if (!empty($address)) {
                    $addr = $address . ', ' . $ward_name . ', ' . $district_name . ', ' . $province_name;
                    $coor = Functions::geocode($addr);
                    $lat = $coor['lat'];
                    $lng = $coor['lng'];
                }
            }
            $post_news = PostNews::create([
                'user_id' => $user_id,
                'owner_name' => $owner_name,
                'owner_phone' => $owner_phone,
                'email' => $owner_email,
                'province' => $province,
                'province_name' => $province_name,
                'district' => $district,
                'district_name' => $district_name,
                'ward' => $ward,
                'ward_name' => $ward_name,
                'address' => $address,
                'type_id' => $type_post,
                'title' => $title,
                'description' => nl2br($description),
                'price' => $price,
                'deposit' => $deposit,
                'amount_people' => $amount_people,
                'size' => $size,
                'date_available' => date('Y/m/d', strtotime($date_available)),
                'type_electric_price' => $type_electric_price,
                'electricity_price' => $electric,
                'electric_unit'=>$electric_unit,
                'type_water_price' => $type_water_price,
                'water_price' => $water,
                'water_unit'=>$water_unit,
                'lat' => $lat,
                'lng' => $lng,
            ]);


            //images
            $imageData = [];
            if ($request->file('images')) {
                foreach ($images as $image) {
                    $imageData[] = self::uploadImage($image);
                }
            }
            if (!empty($imageData)) {
                PostNews::where('id', $post_news->id)->update([
                    'image' => $imageData[0],
                ]);
                foreach ($imageData as $image) {

                    PostImage::create([
                        'post_id' => $post_news->id,
                        'image' => $image,
                    ]);
                }
            }


            //amenities
            if (!empty($amenities)) {
                foreach ($amenities as $amenity) {
                    $post_amenity = [
                        'post_id' => $post_news->id,
                        'amenity_id' => $amenity,
                        'type' => Amenity::AMENITY,
                    ];
                    PostAmentitie::create($post_amenity);
                }
            }
            //policy
            if (!empty($policy)) {
                foreach ($policy as $item) {
                    $post_policy = [
                        'post_id' => $post_news->id,
                        'amenity_id' => $item,
                        'type' => Amenity::POLICY,
                    ];
                    PostAmentitie::create($post_policy);
                }
            }

            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();
            dd($exception->getMessage() . '|' . $exception->getLine());
        }
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);

    }

    public function updatePostNews(Request $request)
    {
        $data = $request->except('post_id', 'imageDel', 'images', 'electricity_price_text', 'water_price_text', 'amenities', 'policies');
        $data['date_available'] = date('Y/m/d', strtotime($data['date_available']));
        $id = $request->post_id;
        $imageDel = json_decode($request->imageDel);
        $images = $request->file('images_arr');
        $electricity_price_text =  preg_replace('/[^0-9]/', '',$request->electricity_price_text);
        $water_price_text =  preg_replace('/[^0-9]/', '',$request->water_price_text);
        //insert html br
        $data['description'] = nl2br($data['description']);

        try {
            \DB::beginTransaction();
            $amenities = $request->amenities;
            $policies = $request->policies;
            if (!empty($amenities)) {
                PostAmentitie::where('post_id', $id)->where('type',Amenity::AMENITY)->delete();
                if (is_array($amenities)) {
                    foreach ($amenities as $amenity) {
                        PostAmentitie::create([
                            'post_id' => $id,
                            'amenities_id' => $amenity,
                            'type' => Amenity::AMENITY,
                        ]);
                    }
                }
            }
            if (!empty($policies)) {
                PostAmentitie::where('post_id', $id)->where('type',Amenity::POLICY)->delete();
                if (is_array($policies)) {
                    foreach ($policies as $policy) {
                        PostAmentitie::create([
                            'post_id' => $id,
                            'amenities_id' => $policy,
                            'type' => Amenity::POLICY,
                        ]);
                    }
                }
            }

            ///delete image and remove from public path
            if (!empty($imageDel)) {
                foreach ($imageDel as $image) {
                    $item = PostImage::where('post_image.id', $image)->where('post_id', $id)->first();
                    @unlink(public_path('files/' . $item->image));
                    PostImage::destroy($image);
                }
            }
            // add new images
            $imageData = [];
            if ($request->file('images')) {
                foreach ($images as $image) {
                    $imageData[] = Functions::uploadImage($image);
                }
            }
            if (!empty($imageData)) {
                $check_img = PostImage::where('post_id', $id)->first();
                if (empty($check_img)) {
                    PostNews::where('id', $id)->update([
                        'image' => $imageData[0],
                    ]);
                }
                foreach ($imageData as $image) {
                    PostImage::create([
                        'post_id' => $id,
                        'image' => $image,
                    ]);
                }
            }
            //get name of province, district, ward
            if (!empty($data['province'])) {
                $data['province_name'] = Functions::getProvinceName($data['province'])->name;
            }
            if (!empty($data['district'])) {
                $data['district_name'] = Functions::getDistrictName($data['district'])->name;
            }
            if (!empty($data['ward'])) {
                $data['ward_name'] = Functions::getWardName($data['ward'])->name;
            }
            //lấy lat lng bằng gg API
            if (empty($data['lat']) || empty($data['lng'])) {
                if (!empty($address)) {
                    $addr = $address . ', ' . $data['ward_name'] . ', ' . $data['district_name'] . ', ' . $data['province_name'];
                    $coor = Functions::geocode($addr);
                    $data['lat'] = $coor['lat'];
                    $data['lng'] = $coor['lng'];
                }
            }
            //electrict price
            if (!empty($data['type_electric_price'])) {
                switch ($data['type_electric_price']) {
                    case 1:
                        $data['type_electric_price'] = PostNews::state_price;
                        $data['electricity_price'] = 'Giá nhà nước';
                        break;
                    case 2:
                        $data['type_electric_price'] = PostNews::fluctuations_price;
                        $data['electricity_price'] = 'Giá biến động';
                        break;
                    case 3:
                        $data['type_electric_price'] = PostNews::power_meter;
                        $data['electricity_price'] = $electricity_price_text;
                        $data['electric_unit'] = '/Kwh';
                        break;
                    case 4:
                        $data['type_electric_price'] = PostNews::person;
                        $data['electricity_price'] = $electricity_price_text;
                        $data['electric_unit'] = '/Người';
                        break;
                    case 5:
                        $data['type_electric_price'] = PostNews::free;
                        $data['electricity_price'] = 'Miễn phí';
                        break;
                    default:
                        break;
                }
            }
            //water price
            if (!empty($data['type_water_price'])) {
                switch ($data['type_water_price']) {
                    case 1:
                        $data['type_water_price'] = PostNews::state_price;
                        $data['water_price'] = 'Giá nhà nước';
                        break;
                    case 2:
                        $data['type_water_price'] = PostNews::fluctuations_price;
                        $data['water_price'] = 'Giá biến động';
                        break;
                    case 3:
                        $data['type_water_price'] = PostNews::power_meter;
                        $data['water_price'] = $water_price_text;
                        $data['water_unit'] = '/Kwh';
                        break;
                    case 4:
                        $data['type_water_price'] = PostNews::person;
                        $data['water_price'] = $water_price_text;
                        $data['water_unit'] = '/Người';
                        break;
                    case 5:
                        $data['type_water_price'] = PostNews::free;
                        $data['water_price'] = 'Miễn phí';
                        break;
                    default:
                        break;
                }
            }
            PostNews::find($id)->update($data);

            \DB::commit();
            return response([
                'status' => 1,
                'message' => 'Edit sucess!',
            ]);
        } catch (\Exception $e) {
            \DB::rollBack();
            dd($e->getMessage() . '|' . $e->getLine());
        }
    }

    public function deletePostNews(Request $request)
    {
        $id = $request->id;
        try {
            \DB::beginTransaction();
            PostNews::find($id)->delete();
            PostImage::where('post_id', $id)->delete();
            PostAmentitie::where('post_id', $id)->delete();
            \DB::commit();
            return response([
                'status' => 1,
                'message' => 'deleted',
            ]);
        } catch (\Exception $e) {
            \DB::rollBack();
            dd($e->getMessage() . '|' . $e->getLine());
        }
    }

    public function uploadImage($file, $old = null)
    {
        try {
            $filename = time() . uniqid() . '.' . $file->getClientOriginalExtension();
            $img = Image::make($file->getRealPath());
            //add watermark
            $watemark = Image::make(public_path('files/itro_watermark_1.png'))->resize(150,150);
            $img->insert($watemark,'center');

            switch ($img->exif('Orientation')) {

                case 2:
                    $img->flip();
                    break;

                case 3:
                    $img->rotate(180);
                    break;

                case 4:
                    $img->rotate(180)->flip();
                    break;

                case 5:
                    $img->rotate(270)->flip();
                    break;

                case 6:
                    $img->rotate(270);
                    break;

                case 7:
                    $img->rotate(90)->flip();
                    break;

                case 8:
                    $img->rotate(90);
                    break;
            }

            if ($img->height() > 1024) {
                $img = $img->resize(null, $img->height() / 2, function ($constraint) {
                    $constraint->aspectRatio();
                });
            }
            $img = $img->save(public_path('files/' . $filename));

            if ($old) {
                @unlink(public_path('files/' . $old));
            }

            return $filename;
        } catch (Exception $exception) {
            \Log::info($exception->getTraceAsString());

            return null;
        }
    }

    public function getPostType()
    {
        $dataType = \DB::table('post_type')->get();
        return response([
            'status' => 1,
            'dataProvince' => $dataType,
        ]);

    }

    public function getProvince(Request $request)
    {
        $dataProvince = Province::all();
        return response([
            'status' => 1,
            'dataProvince' => $dataProvince,
        ]);
    }

    public function getDistrict(Request $request)
    {
        $province = $request->get('province', null);
        if ($province != null) {
            $dataDistrict = \DB::table('district')->where('provinceid', $province)->get();
        }
        return response([
            'status' => 1,
            'dataDistrict' => $dataDistrict,
        ]);
    }

    public function getWard(Request $request)
    {
        $district = $request->get('district', null);
        if ($district != null) {
            $dataWard = \DB::table('ward')->where('districtid', $district)->get();
        }
        return response([
            'status' => 1,
            'dataWard' => $dataWard,
        ]);
    }

    public function editPostNews($slug, $id)
    {
        $post = PostNews::find($id);
        $post->join('post_type', 'post_news.type_id', '=', 'post_type.id')->first();
        $amenities = Amenity::where('user_id', 0)->where('type', Amenity::AMENITY)->get();
        $policies = Amenity::where('user_id', 0)->where('type', Amenity::POLICY)->get();
        return view('frontend3.post_news_2.edit', compact('post', 'amenities', 'policies'));
    }

    public function showAndHidenPost(Request $request){
        $id = $request->id;
        $post = PostNews::find($id);
        if($post->status==1){
            $data = true;
            $post->update([
                'status'=>null,
            ]);
        }else{
            $data = false;
            $post->update([
                'status'=>true,
            ]);
        }
        return response([
            'status'=>1,
            'message'=> 'Ẩn/hiện tin đăng',
            'data'=>$data,
        ]);
    }

    public function uploadImageTemp(Request $request)
    {
        $images = $request->file('images');
        $imageData = [];
        if ($images) {
            foreach ($images as $image) {
                $imageData[] = self::uploadImage($image);
            }
        }
        $imageID = [];
        if (!empty($imageData)) {
            foreach ($imageData as $image) {
                $imageID[] = PostImage::create([
                    'image' => $image,
                ])->id;
            }
        }
        return response([
            'status'=>1,
            'message'=>'success!',
            'data'=>$imageID
        ]);
    }


}
