<?php

namespace App\Http\Controllers\Api\v1;

use App\Components\Functions;
use App\Models\Amenity;
use App\Models\Favorite;
use App\Models\PostAmentitie;
use App\Models\PostImage;
use App\Models\PostNews;
use Illuminate\Http\Request;
use Image;

class PostNewsController extends BaseController
{
    /**
     * @api {get} /post-news/ data Danhh sách filter
     * @apiName /post-news/filter
     * @apiGroup PostNews
     * @apiParam {String} search
     * @apiParam {String} sort
     * @apiParam {String} province
     * @apiParam {String} district
     * @apiParam {String} type
     * @apiParam {String} amenities
     * @apiParam {String} price
     * @apiParam {String} page
     * @apiParam {String} pagesize
     *
     * @apiDescription Api Danh sách dữ liệu lọc theo các trường
     * @apiSuccess {Number} status 1 hoặc 0. 1 là thành công, 0 là không thành công.
     * @apiSuccess {String} message  Tin nhắn hệ thống.
     * @apiSuccess {String} data
     */

    public function listPostNews(Request $request)
    {
        $fields = $request->all();
        $data = PostNews::query();
        $data->select('post_news.*');
        if (!empty($fields['search']) && $fields['search'] != null || $fields['search'] != '') {
            $data->where('post_news.title', 'like', "%" . $fields['search'] . "%");
        }
        if (!empty($fields['sort'])) {
            switch ($fields['sort']) {
                case 1:
                    $data->orderBy('post_news.title', 'asc');
                    break;
                case 2:
                    $data->orderBy('post_news.title', 'desc');
                    break;
                case 3:
                    $data->orderBy('post_news.price', 'asc');
                    break;
                case 4:
                    $data->orderBy('post_news.price', 'desc');
                    break;
                default:
                    $data->orderBy('post_news.id', 'desc');
                    break;
            }
        }
        if (!empty($fields['province'])) {
            $data->where('post_news.province', $fields['province']);
        }
        if (!empty($fields['district'])) {
            $data->whereIn('post_news.district', $fields['district']);
        }
        if (!empty($fields['type'])) {
            $data->whereIn('post_news.type_id', $fields['type']);
        }
        if (!empty($fields['amenities'])) {
            $data->leftJoin('post_amenities', 'post_amenities.post_id', '=', 'post_news.id')
                ->whereIn('post_amenities.amenity_id', $fields['amenities'])
                ->groupBy('post_news.id');
        }
        if (!empty($fields['price'])) {
            $post_range = \DB::table('post_range_price')->where('id', $fields['price'])->first();
            $data->whereBetween('post_news.price', [$post_range->fee_from, $post_range->fee_to]);
        }

        $data = $data->orderBy('post_news.id', 'desc')->paginate($fields['pagesize'], ['*'], 'page', $fields['page']);
        foreach ($data as $item) {
            $item->image = '/files/' . $item->image;
        }

        //get favorite
        foreach ($data as $item) {
            if (is_numeric($item->electricity_price)) {
                $item->electricity_price = (int)($item->electricity_price);
            }
            if (is_numeric($item->water_price)) {
                $item->water_price = (int)($item->water_price);
            }
            $item->favorite_status = false;
            if (isset($this->user->id)) {
                $user_id = $this->user->id;
                $post_favorites = Favorite::where('user_id', $user_id)->get();
                foreach ($post_favorites as $favorite) {
                    if ($item->id == $favorite->post_id) {
                        $item->favorite_status = true;
                    }
                }
            }
        }

        return response([
            'status' => 1,
            'message' => 'Success!',
            'total' => $data->total(),
            'data' => $data->items(),
        ]);
    }

    /**
     * @api {get} /post-news/ detail Chi tiết tin
     * @apiName /post-news/detail
     * @apiGroup PostNews
     * @apiParam {String} id
     *
     * @apiDescription Api chi tiết tin
     * @apiSuccess {Number} status 1 hoặc 0. 1 là thành công, 0 là không thành công.
     * @apiSuccess {String} message  Tin nhắn hệ thống.
     * @apiSuccess {String} data
     */
    public function postDetail(Request $request)
    {
        $id = $request->get('id', null);
        if ($id == null) {
            return response([
                'status' => 0,
                'message' => 'Error!'
            ]);
        }
        $dataPostDetail = PostNews::find($id);

        $amenities = \DB::table('post_amenities')
            ->select('amenities.id', 'amenities.name', 'amenities.type', 'amenities.mobile_image')
            ->join('amenities', 'post_amenities.amenity_id', '=', 'amenities.id')
            ->where('post_amenities.post_id', $id)
            ->where('post_amenities.deleted_at', '=', NULL)->get();
        foreach ($amenities as $amenity) {
            $amenity->mobile_image = '/files/' . $amenity->mobile_image;
        }
        $images = PostImage::where('post_id', $id)->select('id', 'image')->get();
        foreach ($images as $image) {
            $image->image = '/files/' . $image->image;
        }

        $postRelation = PostNews::select('post_news.*')
            ->where('post_news.id', '<>', $id)
            ->where('post_news.type_id', $dataPostDetail->type_id)
            ->where('post_news.ward', $dataPostDetail->ward)
            ->get();
        foreach ($postRelation as $post) {
            $post->image = "/files/" . $post->image;
        }

        $post_type = PostNews::query()->select('post_type.*')->join('post_type', 'post_news.type_id', '=', 'post_type.id')->first();

        //add more attribute
        if (!empty($dataPostDetail)) {
            $dataPostDetail->amenities = $amenities;
            $dataPostDetail->image = '/files/' . $dataPostDetail->image;
            $dataPostDetail->images = $images;
            $dataPostDetail->post_more = $postRelation;
            $dataPostDetail->link_to_share = url(str_slug($post_type->name) . "/" . str_slug($dataPostDetail->title . "-" . $dataPostDetail->id));
        }
        //get favorite
        $dataPostDetail->favorite_status = false;
        if (isset($this->user->id)) {
            $user_id = $this->user->id;
            $post_favorites = Favorite::where('user_id', $user_id)->get();
            foreach ($post_favorites as $favorite) {
                if ($dataPostDetail->id == $favorite->post_id) {
                    $dataPostDetail->favorite_status = true;
                }
            }
        }

        return response([
            'status' => 1,
            'message' => 'Success!',
            'data' => $dataPostDetail,
        ]);
    }

    /**
     * @api {post} /post-news/ Create tạo tin đăng
     * @apiName /post-news/create
     * @apiGroup PostNews
     * @apiParam {String} id
     *
     * @apiDescription Api tạo tin đăng
     * @apiSuccess {Number} status 1 hoặc 0. 1 là thành công, 0 là không thành công.
     * @apiSuccess {String} message  Tin nhắn hệ thống.
     * @apiSuccess {String} data
     */
    public function createPost(Request $request)
    {
        $user_id = $this->user->id;
        $data = $request->except('images', 'electricity_price_text', 'water_price_text', 'amenities', 'policies');
        $data['date_available'] = date('Y/m/d', strtotime($data['date_available']));
        $images = $request->images;
        $data['user_id'] = $user_id;
        $data['description'] = nl2br($data['description']);

        try {
            \DB::beginTransaction();
            $post = PostNews::create($data);
            $id = $post->id;
            $amenities = $request->amenities;
            $policies = $request->policies;
            if (isset($amenities)) {
                if (is_array($amenities)) {
                    foreach ($amenities as $amenity) {
                        PostAmentitie::create([
                            'post_id' => $id,
                            'amenity_id' => $amenity,
                            'type' => Amenity::AMENITY,
                        ]);
                    }
                }
            }
            if (isset($policies)) {
                if (is_array($policies)) {
                    foreach ($policies as $policy) {
                        PostAmentitie::create([
                            'post_id' => $id,
                            'amenity_id' => $policy,
                            'type' => Amenity::POLICY,
                        ]);
                    }
                }
            }

            // add new images
            $imageData = [];
            if ($request->file('images')) {
                foreach ($images as $image) {
                    $imageData[] = self::uploadImage($image);
                }
            }
            if (!empty($imageData)) {
                $check_img = PostImage::where('post_id', $id)->first();
                if (empty($check_img)) {
                    $data['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($data['address'])) {
                    $addr = $data['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'] = $request->electricity_price_text;
                        $data['electric_unit'] = '/Kwh';
                        break;
                    case 4:
                        $data['type_electric_price'] = PostNews::person;
                        $data['electricity_price'] = $request->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'] = $request->water_price_text;
                        $data['water_unit'] = '/Khối';
                        break;
                    case 4:
                        $data['type_water_price'] = PostNews::person;
                        $data['water_price'] = $request->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' => 'Create sucess!',
            ]);
        } catch (\Exception $e) {
            \DB::rollBack();
            dd($e->getMessage() . '|' . $e->getLine());
        }
    }


    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 = $request->imageDel;
        $images = $request->images;
        $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,
                            'amenity_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,
                            'amenity_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[] = self::uploadImage($image);
                }
            }
            if (!empty($imageData)) {
                $check_img = PostImage::where('post_id', $id)->first();
                if (empty($check_img)) {
                    $data['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($data['address'])) {
                    $addr = $data['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'] = $request->electricity_price_text;
                        $data['electric_unit'] = '/Kwh';
                        break;
                    case 4:
                        $data['type_electric_price'] = PostNews::person;
                        $data['electricity_price'] = $request->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'] = $request->water_price_text;
                        $data['water_unit'] = '/Khối';
                        break;
                    case 4:
                        $data['type_water_price'] = PostNews::person;
                        $data['water_price'] = $request->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::destroy($id);
            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 getAmenities()
    {
        $amenities = Amenity::where('user_id', 0)
            ->where('type', Amenity::AMENITY)->get();
        return response([
            'status' => 1,
            'message' => 'success',
            'data' => $amenities,
        ]);

    }

    public function getPolicies()
    {
        $policies = Amenity::where('user_id', 0)
            ->where('type', Amenity::POLICY)->get();
        return response([
            'status' => 1,
            'message' => 'success',
            'data' => $policies,
        ]);

    }

    public function getRangePrice()
    {
        $range_price = \DB::table('post_range_price')->get();
        return response([
            'status' => 1,
            'message' => 'success',
            'data' => $range_price,
        ]);

    }

    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 getFavorite(Request $request)
    {
        $userId = $this->user->id;
        $items = Favorite::query()->rightJoin('post_news', 'post_favorite.post_id', '=', 'post_news.id')
            ->where('post_favorite.user_id', $userId)->get();
        //get favorite
        foreach ($items as $item) {
            $item->image = '/files/' . $item->image;
            $item->favorite_status = true;
        }

        return response([
            'status' => 1,
            'message' => 'Danh sách favorite',
            'data' => $items,
        ]);
    }

    public function createFavorite(Request $request)
    {
        $user_id = $this->user->id;
        if (empty($user_id) || $user_id == null) {
            return response([
                'status' => 0,
                'message' => 'Hãy đăng nhập để thực hiện chức năng này.',
            ]);
        }
        $post_id = $request->post_id;
        if (empty($post_id)) {
            return response([
                'status' => 0,
                'message' => 'Bạn chưa nhập ID bài đăng.'
            ]);
        }

        $check = false;
        $favorite = Favorite::where('user_id', $user_id)
            ->where('post_id', $post_id)->count();

        if ($favorite == 0) {
            Favorite::create([
                'user_id' => $user_id,
                'post_id' => $post_id,
            ]);
            $check = true;
        } else {
            Favorite::where('user_id', $user_id)
                ->where('post_id', $post_id)->delete();
        }

        return response([
            'status' => 1,
            'message' => 'Add favorite',
            'data' => $check,
        ]);
    }

    public function myPostNews()
    {
        if (!isset($this->user->id)) {
            return response([
                'status' => 0,
                'message' => 'Login to continue',
                'data' => null,
            ]);
        };

        $user_id = $this->user->id;
        $data = PostNews::where('user_id', $user_id)->get();

        //get favorite
        foreach ($data as $item) {
            $item->image = '/files' . $item->image;
            $item->favorite_status = false;
            $post_favorites = Favorite::where('user_id', $user_id)->get();
            foreach ($post_favorites as $favorite) {
                if ($item->id == $favorite->post_id) {
                    $item->favorite_status = true;
                }
            }
        }
        return response([
            'status' => 1,
            'message' => 'List My Post',
            'data' => $data,
        ]);

    }

    public function getPostProvince()
    {
        $data = PostNews::select('province','province_name', \DB::raw('count(province) as count'))
            ->groupBy('province')
            ->get();

        return response([
            'status'=>1,
            'message'=>'success',
            'data'=>$data,
        ]);
    }

}
