<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;
use DB;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Carbon;
use App\Model\Projects;
use App\Model\Orders;
use App\Model\Bids;
use App\Model\CategoryToFreelancer;
use App\Model\Chats;
use App\Model\Entity\Project;
use App\Model\Project_status;
use App\Model\Delivery_slices;
use App\Model\Timelines;
use App\Model\Feedbacks;
use Illuminate\Support\Facades\Storage;

class ProjectController extends Controller
{
    //
    public function __construct()
    {
        $this->middleware('auth')->except(['projectFilter']);
        $this->middleware('RegistrationStage');
        // $this->middleware('RegistrationStage')->except('saveQualifications','saveResult');
    }

    public function findProjects(Request $request)
    {
        $url = '';
        // DB::enableQueryLog();
        // $freelancer_id = Auth::id();
        // $freelancer_categories = CategoryToFreelancer::where('freelancer_id', $freelancer_id)
        // ->get();
        // $freelancer_categories[0]['category_id']
        // $projects = Projects::select(["*", DB::raw("(select count(id) from bids where project_id = projects.id ) as bids")])->where(['status' => 'RTA'])->whereIn('category_id', [1]);
        // $projects = Projects::select(["*", DB::raw("(select count(id) from bids where project_id = projects.id ) as bids")])->where(['status' => 'RTA','delete_status' => 0]);

        $freelancer_id = Auth::id();
        $freelancer_categories = CategoryToFreelancer::select('category_id')->where([['freelancer_id', $freelancer_id],['status','!=', 3]])
        ->get();
        $projects = Projects::select(["*", DB::raw("DATE(projects.bid_expiry_date) as bid_expiry_date"), DB::raw("DATE(projects.deadline_date) as deadline_date"), DB::raw("(select count(id) from bids where project_id = projects.id ) as bids")])->where(['status' => 'RTA','delete_status' => 0 ])->whereIn('category_id', $freelancer_categories);
  
        if (Auth::check()) {
            $url = route('findProjects');
            if ($request->page) {
                $url .= '?page=' . $request->page;
            }

            if ($request->sort) {
                switch ($request->sort) {
                    case 'relevance':
                        #todo::according to profile
                        $projects->orderBy('id', 'desc');
                        break;

                    case 'newest':
                        $projects->orderBy('created', 'desc');
                        break;

                    case 'ltoh':
                        $projects->orderBy('price', 'asc');
                        break;

                    case 'htol':
                        $projects->orderBy('price', 'desc');
                        break;

                    default:
                        $projects = '';
                        break;
                }
            }

            $projects = $projects->paginate(10);
        } else {
            $projects = $projects->take(10)->where(['status' => 'RTA'])->get();
        }
        // dd(DB::getQueryLog());
        $filters = config('filters');
        $pageData = new \stdClass();
        $pageData->title='Find Work';
        // dd($projects);
        return view('findProjects', compact('projects', 'url', 'pageData','filters'));
    }

    public function detail($id)
    {
        $projectId = base64_decode($id);
        $delivery_slices = $feedback= [];
        $allowStatus=['Disable','RTA'];

        $projectDetail = Projects::where(['id' => $projectId])->with(['subjectData', 'serviceData'])->get()->first();
        
        // $order = Orders::where(['project_id' => $projectId, 'freelancer_id' => Auth::user()->id])->with('project')->get()->first();
        // if(!empty($order)){
        //     $feedback = Feedbacks::where(['project_id' => $projectId])->orderBy('id','desc')->get()->first();
        // }
        // dd( $projectDetail->freelancer_id == Auth::user()->id);
        if(!in_array($projectDetail->status ,$allowStatus) && $projectDetail->freelancer_id != Auth::user()->id){
            return redirect('find-work');
        }
        if(!in_array($projectDetail->status,$allowStatus,)){
            // $feedback = Feedbacks::where(['project_id' => $projectId])->orderBy('id','desc')->get()->first();
            $feedback = Timelines::where(['project_id' => $projectId,'event'=>'Feedback'])->orderBy('created','desc')->get()->first();
// dd($feedback);
            $delivery_slices = Delivery_slices::where(['project_id' => $projectId])->get()->all();
            $projectDetail['view'] = 1;
            $projectDetail->save();
        }
        // DB::enableQueryLog();

        # todo::add permition for ALLOTED projects 
        $projects = Projects::select(["*", DB::raw("(select count(id) from bids where project_id = projects.id ) as bids")])->where(['status' => 'RTA', 'subject' => $projectDetail->subject])->where('id', '!=', $projectDetail->id)->get();
        // dd($projectDetail);
        // dd(DB::getQueryLog());

        $checkBid = Bids::select(['id'])->where(['freelancer_id' => Auth::user()->id, 'project_id' => $projectDetail->id])->get()->first();

        # Creating page data
        $pageData = new \stdClass();
        $pageData->title = $projectDetail->topic;
        return view('project.detail', compact('projectDetail', 'projects', 'checkBid', 'pageData', 'delivery_slices', 'feedback'));
    }

    public function projectFilter(Request $request)
    {
        // DB::enableQueryLog();
        $user = Auth::user();
        $freelancer_id = Auth::id();
        $freelancer_categories = CategoryToFreelancer::select('category_id')->where([['freelancer_id', $freelancer_id],['status','!=', 3]])
        ->get();
        $projects = Projects::select(["*", DB::raw("DATE(projects.bid_expiry_date) as bid_expiry_date"), DB::raw("DATE(projects.deadline_date) as deadline_date"), DB::raw("(select count(id) from bids where project_id = projects.id ) as bids")])->where(['status' => 'RTA','delete_status' => 0 ])->whereIn('category_id', $freelancer_categories);
        if ($request->sort) {
            switch ($request->sort) {
                case 'relevance':
                    # todo::according to profile
                    // $projects->where('category_id', '=', "$freelancer_categories");
                    $projects;
                    // $projects->orderBy('id', 'asc');
                    break;

                case 'newest':
                    $projects->orderBy('id', 'desc');
                    break;

                case 'ltoh':
                    $projects->orderBy('price', 'asc');
                    break;

                case 'htol':
                    $projects->orderBy('price', 'desc');
                    break;

                default:
                    $order = '';
                    break;
            }
        }

        //filters

        if ($request->filters && count($request->filters) > 0) {

            if (isset($request->filters['level'])) {
                $projects->whereIn('experience_level', $request->filters['level']);
            }
            if (isset($request->filters['budget'])) {
                $budget = $request->filters['budget'];
                $projects->where(function (Builder $projects) use ($budget) {
                    foreach ($budget as $b) {
                        $b = explode('-', $b);
                        $projects->orWhereBetween('price', $b);
                    }
                });
            }
            if (isset($request->filters['category'])) {
                $projects->whereIn('service', $request->filters['category']);
            }
            if (isset($request->filters['bids'])) {
                $bids = $request->filters['bids'];

                $havingSrt = '';
                foreach ($bids as $b) {
                    $b = explode('-', $b);
                    $havingSrt .= "(bids > " . $b[0] . " AND bids < " . $b[1] . ") OR";
                }
                $havingSrt = rtrim($havingSrt, 'OR');
                $projects->havingRaw($havingSrt);
            }
        }

        $offset = 0;
        $limit = 10;
        if ($request->page && $request->page > 1) {
            $offset = ($request->page - 1) * $limit;
        }

        if ($request->searchStr && $request->searchStr != "") {
            $projects->where('topic', 'like', '%' . $request->searchStr . '%');
        }

        $projects = $projects->skip($offset)->take($limit)->get();
        // dd(DB::getQueryLog());
        // dd($projects);
        return $projects;
    }

    public function placeBid(Request $request)
    {

        $if_freelancer_not_eligible_for_bid = CategoryToFreelancer::where([['freelancer_id', '=', Auth::id()], ['status', '!=', 2 ]])->get();
        if ($request->projectId) {
            if (Auth::user()->profile_percentage < 100) {
                return ['status' => 0, 'message' => 'due to Incomplete Profile!'];
            }
            if (Auth::user()->reg_stage == 3) {
                return ['status' => 0, 'message' => "due to your test is currently under review."];
                die;
            }
            if (Auth::user()->reg_stage != 4) {
                return ['status' => 0, 'message' => "as you have not completed the eligibility test."];
            }

            if(count($if_freelancer_not_eligible_for_bid) > 0 ) {

                return ['status' => 0, 'message' => "as you have not passed the eligibility test."];
            }
            
            $checkBid = Bids::select(['id'])->where(['freelancer_id' => Auth::user()->id, 'project_id' => $request->projectId])->get()->first();
            if (!$checkBid) {
                $checkBidCount = Bids::select(['id'])->where(['freelancer_id' => Auth::user()->id, 'allotment_status' => 0])->get()->count();
                if ($checkBidCount > 9) {
                    $rtn = ['status' => 0, 'message' => 'Bid limit exceeded!'];
                } else {
                    $bid = new Bids;
                    $bid->freelancer_id = Auth::user()->id;
                    // $bid->proposal = $request->proposal;
                    // $bid->proposal_date = Carbon::now()->addDays( $request->proposal_days);
                    $bid->proposal_desc = $request->proposal_desc;
                    $bid->project_id = $request->projectId;
                    $bid->save();

                    $emailData = [
                        'name' => Auth::user()->name,
                        'email' => Auth::user()->email
                    ];
                    Mail::send('emails.bid_confirm', $emailData, function ($m) use ($emailData) {
                        // $m->from($data['from'], 'Your Application');
                        $m->to($emailData['email'], $emailData['name'])->subject('Bid Placed Sccessfully');
                    });

                    $rtn = ['status' => 1, 'message' => 'Bid Placed Sccessfully!'];
                }
            } else {
                $rtn = ['status' => 0, 'message' => 'Bid Already placed!'];
            }
            return $rtn;
        }
    }
    public function submitProject(Request $request, $id)
    {
        $reqData = $request->all();
        // dd($reqData);
        $projectId = base64_decode($id);
        // $order = Orders::where(['project_id' => $projectId])->get()->first();
        $projects = Projects::where(['id' => $projectId])->get()->first();

        if (empty($projects) || empty($reqData['submit_files'])) {
            return ['status' => 0, 'message' => 'Something went Wrong'];
        }
        $delivery = new Delivery_slices;
            foreach ($reqData['submit_files'] as $file) {
                $data[] = 'project_submit/' . $this->uploadOnS3('project_submit', $file);
            }

            $data = serialize($data);
            $delivery['project_id'] = $projects->id;
            $delivery['description'] = $request->description;
            $delivery['attachment'] = $data;
            $delivery['uploaded_by'] = 0;
            $delivery['status'] = 1;
            $attArr['attachment']=unserialize($data);
            #todo::according to Status ('status'=>'In process')
            // $projects = Projects::where(['id' => $projectId])->get()->first();
            if(!empty($projects)){
                $projects->status='Draft';
                $projects->finishing_date=Date('Y-m-d H:i:s');
                $projects->save();
            }
            if ($delivery->save()) {
                $files=json_encode($attArr);
                $timelines = Timelines::create(['project_id' => $projectId, 'event' => 'Draft', 'perform_by' => 0, 'freelancer_id' => Auth::user()->id, 'attachment' => $files,'description'=>$request->description,'delivery_slices_id'=>$delivery->id]);
                return ['status' => 1, 'message' => 'Project Succesfully Submitted'];
            }
        return ['status' => 0, 'message' => 'Invaild request'];
    }
    private function uploadOnS3($folder, $file)
    {
        $s = Storage::disk('s3')->put('workolics/' . $folder, $file);
        $ex = explode('/', $s);
        return  end($ex);
    }
    public function sendChat(Request $request)
    {
        $request = $request->all();
        $file='';
        // print_r($request);die;
        // $orderId = base64_decode($request['orderId']);
        $projectId = base64_decode($request['projectId']);

        if (empty($projectId)) {
            return ['status' => 0, 'message' => 'paramenter missing'];
        }
        // dd($request);
        $chat = new Chats();
        // $chat->order_id = $orderId;
        $chat->project_id = $projectId;
        if(!empty($request['message']))
        $chat->message = @$request['message'];
        if(!empty($request['attachment'])){
            foreach ($request['attachment'] as $file) {
                $files['attachment'][] = 'chats/' . $this->uploadOnS3('chats', $file);
            }
            $file = json_encode(@$files);
            $chat->attachment = $file;
        }
        
        $chat->to_id = Auth::user()->id;
        $chat->type = 'chat';
        // dd($request['attachment']);
        if ($chat->save()) {
            $emailData = [
                'name' => Auth::user()->name,
                'email' => Auth::user()->email,
                'projectId' => $projectId,
                'projectName' => $chat->project->topic
            ];
            Mail::send('emails.message_received', $emailData, function ($m) use ($emailData) {
                // $m->from($data['from'], 'Your Application');
                $m->to('pradeep.solanki@cognustechnology.com', $emailData['name'])->subject('New chat Received');
            });

            return ['status' => 1, 'message' => 'msg sent succesfully'];
        }
       return ['status' => 0, 'message' => 'Something went wrong'];
    }
    public function getChat(Request $request){
        $request = $request->all();
        // $orderId = base64_decode($request['orderId']);
        $projectId = base64_decode($request['projectId']);
        $chats = Chats::where(['project_id' => $projectId,'type'=>'chat'])->orderBy('created', 'asc')->get()->all();
        if (empty($projectId) || empty($chats)) {
            return ['status' => 0, 'message' => 'paramenter missing'];
        }
        if(!empty($chats) && !empty($projectId)){
            Chats::where(['project_id'=> $projectId,'to_id'=>0])->update(['view' => 1]);
        }
        return ['status' => 1, 'message' => 'msg get succesfully', 'chat' => $chats];
        exit();
    }
    public function projectStatus(Request $request)
    {
        $projectId = $request->projectId;
            if (!empty($projectId) && $request->status == 'Allotted') {
            $nextStatus = 'In process';
            $timelines = Timelines::create(['project_id' => $projectId, 'event' => $nextStatus, 'perform_by' => 0, 'freelancer_id' => Auth::user()->id]);
            if ($timelines) {
                $projects = Projects::where(['id' => $projectId, 'status' => $request->status])->with('projectStatusData')->get()->first()->update(['status' => $nextStatus]);

                if ($projects) {
                    return ['status' => 1, 'msg' => "changed succesfully"];
                }
            }
        }
        return['status'=>0,'msg'=>"request not valid"];
    }
}
