<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Mailer\Email;


/**
 * Freelancers Controller
 *
 * @property \App\Model\Table\FreelancersTable $Freelancers
 */

 require_once(ROOT . DS  .'vendor' . DS  . 'S3.php');
class FreelancersController extends AppController
{
    public function index($status=null)
    {
        $condition = [];
        $filter = 0;
        $searchData = array();
        $condition = array();
        if (!empty($this->request->query)) {
            // $filter = 1;
            if (isset($this->request->query['search']) && $this->request->query['search'] != '') {
                $searchData['search'] = $this->request->query['search'];
                $newCondition['Freelancers.name like'] = '%' . trim($this->request->query['search']) . '%';
                $newCondition['Freelancers.email like'] = '%' . trim($this->request->query['search']) . '%';
                $newCondition['Freelancers.mobile like'] = '%' . trim($this->request->query['search']) . '%';
                $condition['OR'] = $newCondition;
                // $freelancers = $this->Freelancers->find('all')->where($condition)->order(['id1'=>'desc'])->toArray();
            } 
            if (isset($this->request->query['approve']) && $this->request->query['approve'] != '') {
                if (($this->request->query['approve']) == 0) {
                    $condition['Freelancers.reg_stage !='] = 4;
                } elseif ($this->request->query['approve'] == 1) {
                    $condition['Freelancers.reg_stage'] = 4;
                } elseif ($this->request->query['approve'] == '') {
                    $condition[] = '';
                }
                // $freelancers = ( $this->Freelancers->find('all')->where($condition)->order(['id'=>'desc'])->toArray());
            }
            if (isset($this->request->query['datefilter']) && $this->request->query['datefilter'] != '') {
                // print_r($this->request->query);die;

                $date = explode('-', $this->request->query['datefilter']);
                $to = date('Y-m-d', strtotime($date[0]));
                $from =  date('Y-m-d', strtotime($date[1]));
                $newCondition['Freelancers.modifed >= '] = $to;
                $newCondition['Freelancers.modifed <= '] = $from;
                $condition[] = $newCondition;
            }
            // $freelancers = $this->Freelancers->find('all')->where($condition)->order(['id'=>'desc'])->toArray();

        }
        $this->paginate = [
            'order' => ['id' => 'desc'], 'conditions' => $condition
        ];
        
        $freelancers = $this->paginate($this->Freelancers);
        
        $this->set(compact('freelancers', 'filter', 'searchData'));
        $this->set('_serialize', ['freelancers'], 'filter');
    }



    public function view($id = null)
    {
        $freelancer = $this->Freelancers->get($id, [
            'contain' => ['Transactions']
        ]);
        if ($freelancer->view == 0) {
            $fls = TableRegistry::get('Freelancers');
            $fl = $fls->get($freelancer->id);
            $fl->view = 1;
            $fls->save($fl);
        }
        // $freelancer->

        $results = TableRegistry::get('Results');
        $essayTest = TableRegistry::get("EssayTest");
        $bids = TableRegistry::get("Bids");
        $Projects = TableRegistry::get("Projects");


        $freelancer->bids =  $bids->find('all')->select(['Projects.topic', 'Bids.allotment_status', 'Bids.project_id', 'Bids.created'])->contain(['Projects'])->where(['freelancer_id' => $id])->toArray();

        $freelancer->results =  $results->find('all')->select(['Questions.question', 'Results.answer_status', 'Results.question_id'])->contain(['Questions'])->where(['freelancer_id' => $id])->toArray();

        $freelancer->essayTest = $essayTest->find()->select(['EssayTest.essay', 'EssayTest.g_mistakes', 'EssayTest.freelancer_id'])->where(['freelancer_id' => $id])->first();
        //pr($freelancer->essayTest); die;
        if (!empty($freelancer['orders'])) {
            foreach ($freelancer['orders'] as $key => $orders) {
                $p_data = $Projects->find('all')->select(['Projects.topic', 'Projects.created'])->where(['Projects.id' => $orders['project_id']])->toArray();
                $assigned_projects[$orders['project_id']]['topic'] = $p_data[0]['topic'];
                $assigned_projects[$orders['project_id']]['created'] = $p_data[0]['created'];
                $assigned_projects[$orders['project_id']]['sub_status'] = $orders['submission_status'];
            }
            $freelancer->assigned_projects = $assigned_projects;
        }

        $s3url =  $this->viewVars['s3url'];
        $Subjects = TableRegistry::get("Subjects")->find('list')->where(['status' => 1])->toArray();
        $this->set(compact('freelancer', 's3url', 'Subjects'));
        $this->set('_serialize', ['freelancer']);
    }

    public function add()
    {
        $freelancer = $this->Freelancers->newEntity();
        $Subjects = TableRegistry::get("Subjects");
        $Subjects = $Subjects->find('list')->where(['status' => 1])->toArray();
        if ($this->request->is('post')) {
            $address_proof = $this->request->data['address_proof'];
            // print_r($address_proof);die;
            if (!empty($this->request->data['address_proof']['name'])) {
                $nameArr = [];
                $value = $this->request->data['address_proof'];
                $tmp_name = $value["tmp_name"];
                $name = str_replace(' ', '-', $value["name"]);
                $ext = pathinfo($name, PATHINFO_EXTENSION);
                $name = substr(pathinfo($name, PATHINFO_BASENAME), 0, 10) . '_' . rand() . '.' . $ext;

                $path = 'profile_image/' . $name;
                $s3 = new \S3(awsAccessKey, awsSecretKey);

                $r = $s3->putObjectFile($tmp_name, bucketName, $path, \S3::ACL_PUBLIC_READ);
                $nameArr[] = $path;
                $this->request->data['address_proof'] = implode(',', $nameArr);
            } else {
                unset($this->request->data['address_proof']);
                $this->request->data['address_proof'] = '';
            }
            $this->request->data['proficient'] = implode(',', $this->request->data['proficient']);

            $freelancer = $this->Freelancers->newEntity();
            $freelancer = $this->Freelancers->patchEntity($freelancer, $this->request->data);
            if ($this->Freelancers->save($freelancer)) {
                $this->Flash->success(__('The freelancer has been saved.'));


                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The freelancer could not be saved. Please, try again.'));
        }

        $this->set(compact('freelancer', 'Subjects'));
        $this->set('_serialize', ['freelancer']);
    }

    public function edit($id = null)
    {
        $freelancer = $this->Freelancers->get($id, [
            'contain' => []
        ]);
        $address_proof = $freelancer['address_proof'];
        // print_r($freelancer);die;
        $Subjects = TableRegistry::get("Subjects");
        $Subjects = $Subjects->find('list')->where(['status' => 1])->toArray();
        // pr($Subjects);die;
        if ($this->request->is(['patch', 'post', 'put'])) {
            if (!empty($this->request->data['address_proof']['name'])) {
                $nameArr = [];
                $value = $this->request->data['address_proof'];
                $tmp_name = $value["tmp_name"];
                $name = str_replace(' ', '-', $value["name"]);
                $ext = pathinfo($name, PATHINFO_EXTENSION);
                $name = substr(pathinfo($name, PATHINFO_BASENAME), 0, 10) . '_' . rand() . '.' . $ext;

                $path = 'profile_image/' . $name;
                $s3 = new \S3(awsAccessKey, awsSecretKey);

                $r = $s3->putObjectFile($tmp_name, bucketName, $path, \S3::ACL_PUBLIC_READ);
                $nameArr[] = $path;
                $this->request->data['address_proof'] = implode(',', $nameArr);
            } else {
                unset($this->request->data['address_proof']);
                $this->request->data['address_proof'] = '';
            }
            $this->request->data['proficient'] = implode(',', $this->request->data['proficient']);
            $freelancer = $this->Freelancers->patchEntity($freelancer, $this->request->data);
            if ($this->Freelancers->save($freelancer)) {
                $this->Flash->success(__('The freelancer has been saved.'));
                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The freelancer could not be saved. Please, try again.'));
        }
        $this->set(compact('freelancer', 'Subjects', 'address_proof'));
        $this->set('_serialize', ['freelancer']);
    }

    public function delete($id = null)
    {
        $this->request->allowMethod(['post', 'delete']);
        $freelancer = $this->Freelancers->get($id);
        if ($this->Freelancers->delete($freelancer)) {
            $this->Flash->success(__('The freelancer has been deleted.'));
        } else {
            $this->Flash->error(__('The freelancer could not be deleted. Please, try again.'));
        }

        return $this->redirect(['action' => 'index']);
    }

    public function export()
    {

        $filename = 'Freelancers-' . date('d M,Y h:i A');

        $results = $this->Freelancers->find('all')->toArray();
        //pr($results);exit;
        $csv_file = fopen('php://output', 'w');

        header('Content-type: application/csv');
        header('Content-Disposition: attachment; filename="' . $filename . '"');

        $header_row = array("ID", "NAME", "EMAIL", "MOBILE", "SKYPE", "COUNTRY", "STATE", "CITY", "PINCODE", "EXPERIENCE", "DEGREE");

        fputcsv($csv_file, $header_row, ',', '"');
        foreach ($results as $result) {

            $row = array(
                $result['id'],
                $result['name'],
                $result['email'],
                $result['mobile'],
                $result['skyp_id'],
                $result['country'],
                $result['state'],
                $result['city'],
                $result['experience'],
                $result['pin_code'],
                $result['degree']
            );

            fputcsv($csv_file, $row, ',', '"');
        }

        fclose($csv_file);

        $this->render(false);
        exit;
    }

    public function approveProfile()
    {
        if ($this->request->is('post') && $this->request->data['id'] != '') {
            $password = "user123";
            $baseUrl = 'https://beta.workolics.com/';
            $websiteEmail = 'support@workolics.com';
            $email = new Email();
            $email->transport('mail');
            try {
                //->from([$this->request->data['email'] => $this->request->data['name']])
                $res = $email->viewVars(['name' => $this->request->data['name'], 'email' => $this->request->data['email'], 'password' => $password, 'baseUrl' => $baseUrl, 'websiteEmail' => $websiteEmail])
                    ->template('approve', 'default')
                    ->emailFormat('both')
                    ->to([$this->request->data['email'] => $this->request->data['name']])
                    ->subject('Your account has been approved')
                    ->send();
            } catch (Exception $e) {
                echo 'Exception : ',  $e->getMessage(), "\n";
            }

            TableRegistry::get('Freelancers')->updateAll(
                ["status" => 1, "reg_stage" => 4, "email_verify" => 1],
                ["id" => $this->request->data['id']]
            );
        }
        return $this->redirect(['action' => 'index']);
        exit;
    }
}
