<?php

namespace App\Http\Controllers\Api\v1;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\FtpDetails;
use App\FtpFilesDetails;
use App\User;
use App\Organization;
use App\Manager;
use Auth;

/**
 * SycleController Class Doc Comment
 *
 * @category Class
 * @package  Api
 * @author   Ripal Darji - ripal.darji@brainvire.com
 *
 */
class SycleController extends Controller
{

    public function __construct()
    {
        //$this->middleware('oauth', ['except' => ['index']]);
        //$this->middleware('auth:api');
        $this->currentUser = app('auth')->guard()->user();
        $this->organization = Organization::where('user_id', $this->currentUser->id)->first();
    }

    /**
     * Display a listing of the FTP Details.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $ftpDetails = DB::table('bussiness_ftp_details')->whereNull('deleted_by')
            ->orderBy('id', 'desc')->get();

        $helperobj = new \App\CommonHelper();
        $ftpInfo = array();
        foreach ($ftpDetails as $value) {
            $info = $value;
            $info->username = $helperobj->decrypt($value->username);
            $info->password = $helperobj->decrypt($value->password);

            $ftpInfo[] = $info;
        }
        return response()->json($ftpDetails);
    }

    /**
     * Insert Details to FTP Table
     *
     * @return \Illuminate\Http\Response
     */
    public function addFtp(Request $request)
    {
        //Validate Parameters
        $this->validate($request, [
            'ip_address' => 'required|ip',
            'port' => 'required|numeric',
            'username' => 'required',
            'password' => 'required',
            'filepath' => 'required',
            'filename' => 'required'
        ]);

        $helperobj = new \App\CommonHelper();
        $username = $helperobj->encrypt($request->username);
        $password = $helperobj->encrypt($request->password);

        //Throw Error if ftp_alias_name is not unique
        $checkIfAvail = DB::table('bussiness_ftp_details')->where('bussiness_id', $this->organization->id)
            ->where('ftp_alias_name', $request->ftp_alias_name)
            ->first();
        if (!empty($checkIfAvail)) {
            return response()->json(['status' => 'fail', 'message' => ALIAS_ERROR]);
        }

        $ftpDetails                   = new FtpDetails();
        $ftpDetails->bussiness_id     = $this->organization->id; //using loggedIn user get organizationId
        $ftpDetails->ftp_alias_name   = $request->ftp_alias_name;
        $ftpDetails->ip_address       = $request->ip_address;
        $ftpDetails->port             = $request->port;

        $ftpDetails->username         = $username;
        $ftpDetails->password         = $password;
        $ftpDetails->created_by       = $this->currentUser->id;

        $date                    = new \DateTime();
        $ftpDetails->created_at         = $date->format('Y-m-d H:i:s');
        $ftpDetails->save();
        $bussiness_ftp_id = $ftpDetails->id;

        $info = array(
            'host' => $request->ip_address,
            'port' => $request->port,
            'username' => $request->username,
            'password' => $request->password,
            'filename' => $request->filename,
            'business_id' => $this->organization->id,
            'filepath' => $request->filepath
        );

        //Transfer FTP File to Local
        $data = $helperobj->getFilesFromFtpToLocal($info);

        if ($data > 0) {
            $this->addFtpFilesDetails($request, $bussiness_ftp_id, 'Pending', $data);
        } else {
            //Error in file dump
            $this->addFtpFilesDetails($request, $bussiness_ftp_id, 'NotDumped', $data);
        }

        return response()->json(['status' => 'success', 'message' => FTP_ADD]);
    }

    /**
     * Insert Details to FTP Files Table
     *
     * @param  array $request, 
     * @param  int $bussiness_ftp_id
     * @return \Illuminate\Http\Response
     */

    public function addFtpFilesDetails($request, $bussiness_ftp_id, $sync_status, $errorMessage)
    {
        $ftpFilesDetails                   = new FtpFilesDetails();
        $ftpFilesDetails->bussiness_ftp_id = $bussiness_ftp_id;
        $ftpFilesDetails->filename   = $request->filename;
        $ftpFilesDetails->filepath       = $request->filepath;
        $ftpFilesDetails->total_rec = 0; //default 0
        $ftpFilesDetails->sync_status = $sync_status;
        $ftpFilesDetails->error_log = ($errorMessage != 1) ? $errorMessage : '';
        $ftpFilesDetails->location_id = $request->location_id;
        $ftpFilesDetails->created_by = $this->currentUser->id;

        $ftpFilesDetails->save();
    }

    /**
     * Update Details to FTP Table throght Id
     *
     * @param  array $request, 
     * @param  int $fid
     * @return \Illuminate\Http\Response
     */
    public function updateFtpDetails(Request $request, $fid)
    {
        //Validate Parameters
        $this->validate($request, [
            'ip_address' => 'required|ip',
            'port' => 'required|numeric',
            'username' => 'required',
            'password' => 'required',
            'filepath' => 'required',
            'filename' => 'required'
        ]);

        $ftpDetails           = FtpDetails::find($fid);
        if (!$ftpDetails) {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }

        //Throw Error if ftp_alias_name is not unique
        $checkIfAvail = DB::table('bussiness_ftp_details')->where('bussiness_id', $this->organization->id)
            ->where('ftp_alias_name', $request->ftp_alias_name)
            ->where('id', '!=', $fid)
            ->first();

        if (!empty($checkIfAvail)) {
            return response()->json(['status' => 'fail', 'message' => ALIAS_ERROR]);
        }

        $helperobj = new \App\CommonHelper();
        $username = $helperobj->encrypt($request->username);
        $password = $helperobj->encrypt($request->password);

        $ftpDetails->bussiness_id     = $this->organization->id;
        $ftpDetails->ftp_alias_name   = $request->ftp_alias_name;
        $ftpDetails->ip_address       = $request->ip_address;
        $ftpDetails->port             = $request->port;

        $ftpDetails->username         = $username;
        $ftpDetails->password         = $password;

        $date                    = new \DateTime();
        $ftpDetails->updated_at         = $date->format('Y-m-d H:i:s');
        $ftpDetails->save();

        $this->updateFtpFilesDetails($request, $fid);

        return response()->json(['status' => 'success', 'message' => FTP_UPDATED]);
    }

    /**
     * Update Details to FTP Files Table.
     *
     * @param  array $request, 
     * @param  int $fid
     * @return \Illuminate\Http\Response
     */

    public function updateFtpFilesDetails($request, $fid)
    {
        $ftpFilesDetails = FtpFilesDetails::where('bussiness_ftp_id', $fid)->first();

        $ftpFilesDetails->bussiness_ftp_id = $fid;
        $ftpFilesDetails->filename   = $request->filename;
        $ftpFilesDetails->filepath       = $request->filepath;
        // $ftpFilesDetails->total_rec = $request->total_rec;
        // $ftpFilesDetails->sync_status = $request->sync_status;
        $ftpFilesDetails->error_log = '';

        $ftpFilesDetails->save();
    }


    /**
     * Remove (Soft Delete) details .
     *
     * @param  int $fid
     * @return \Illuminate\Http\Response
     */
    public function deleteFtpDetails($fid)
    {
        $ftpDetails = FtpDetails::where('id', $fid)->first();
        if (!empty($ftpDetails)) {
            // FtpDetails::destroy($fid);
            $ftpDetails->deleted_by = $this->currentUser->id;
            $date                           = new \DateTime();
            $ftpDetails->deleted_at         = $date->format('Y-m-d H:i:s');
            $ftpDetails->save();

            $ftpFilesDetails = FtpFilesDetails::where('bussiness_ftp_id', $fid)->first();
            $ftpFilesDetails->deleted_by = $this->currentUser->id;
            $date                           = new \DateTime();
            $ftpFilesDetails->deleted_at         = $date->format('Y-m-d H:i:s');
            $ftpFilesDetails->save();

            return response()->json(['status' => 'success', 'message' => FTP_DELETED]);
        }
    }

    /**
     * Get FTP Details through Business Id
     *
     * @param  
     * @return \Illuminate\Http\Response
     * Response will be in key value pair
     */
    public function getFtpDetailsByBusinessId(Request $request)
    {
        //Validate Parameters
        $this->validate($request, [
            'bussiness_id' => 'required'
        ]);

        $ftpDetails = FtpDetails::where('bussiness_id', $request->bussiness_id)->get();

        if (!$ftpDetails) {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }

        $response = array();
        foreach ($ftpDetails as $ftpInfo) {
            $arr['id'] = $ftpInfo->id;
            $arr['alias'] = $ftpInfo->ftp_alias_name;
            $ftp['username'] = $ftpInfo['username'];
            $ftp['password'] = $ftpInfo['password'];
            $ftp['ip_address'] = $ftpInfo['ip_address'];
            $ftp['port'] = $ftpInfo['port'];

            $arr['info'] = $ftp;
            $info[] = $arr;
        }

        $response = $info;
        return response()->json($response);
    }

    /**
     * Get FTP Details through Business Id
     *
     * @param  int $business_id
     * @return \Illuminate\Http\Response
     */
    public function getDetailsByBusinessId($business_id)
    {
        $helperobj = new \App\CommonHelper();

        $ftpDetails = DB::table('bussiness_ftp_details')
            ->leftJoin('bussiness_ftp_files', 'bussiness_ftp_details.id', '=', 'bussiness_ftp_files.bussiness_ftp_id')
            ->where('bussiness_id', $business_id)
            ->get();

        $response = array();

        foreach ($ftpDetails as $key => $value) {
            $res['bussiness_ftp_id'] = $value->id;
            $res['bussiness_id'] = $value->bussiness_id;
            $res['ftp_alias_name'] = $value->ftp_alias_name;
            $res['ip_address'] = $value->ip_address;
            $res['port'] = $value->port;
            $res['username'] = $helperobj->decrypt($value->username);
            $res['password'] = $helperobj->decrypt($value->password);
            $res['created_by'] = $value->created_by;
            $res['error_log'] = $value->error_log;
            $res['sync_status'] = $value->sync_status;
            $res['filepath'] = $value->filepath;
            $res['filename'] = $value->filename;
            $response[] = $res;
        }

        if (!$ftpDetails) {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }

        return response()->json($response);
    }

    /** 
     * Get FTP Details Through File Status
     */
    public function getDetailsByFileStatus(Request $request)
    {
        $ftpFilesDetails = DB::table('bussiness_ftp_files')
            ->select('sync_status', 'branches.name', 'filepath', 'filename', 'bussiness_id', 'ftp_alias_name', 'ip_address')
            ->leftJoin('bussiness_ftp_details', 'bussiness_ftp_files.bussiness_ftp_id', '=', 'bussiness_ftp_details.id')
            ->leftJoin('branches', 'branches.id', '=', 'bussiness_ftp_files.location_id')
            ->where('sync_status', $request->file_status)
            ->get();

        $response = array();

        return response()->json($ftpFilesDetails);
    }

    /** 
     * Get LIsting for CSV files
     */
    public function getCsvDetails(Request $request)
    {
        $response = array();
        $offset = ($request->page - 1) * $request->per_page;

        $ftpFilesDetails = DB::table('bussiness_ftp_files')
            ->select('sync_status', 'filepath', 'filename', 'bussiness_id', 'bussiness_ftp_files.created_at', 'total_rec', 'error_log')
            ->leftJoin('bussiness_ftp_details', 'bussiness_ftp_files.bussiness_ftp_id', '=', 'bussiness_ftp_details.id')
            ->leftJoin('branches', 'branches.id', '=', 'bussiness_ftp_files.location_id');
        if ($request->has('business_id') && $request->business_id > 0) {
            $ftpFilesDetails->where('bussiness_id', $request->business_id);
        }
        if ($request->has('search') &&  ($request->search != '')) {
            $ftpFilesDetails->where('sync_status', 'like', '%' . $request->search . '%');
        }
        $ftpFilesDetails->offset($offset)->limit($request->per_page);

        $ftpFilesDetails = $ftpFilesDetails->get();

        if (!empty($ftpFilesDetails)) {
            foreach ($ftpFilesDetails as $key => $value) {
                $res['filename'] = $value->filename;
                $res['status'] = $value->sync_status;
                $res['error'] = $value->error_log;
                $res['total_rec'] = $value->total_rec;
                $res['created_at'] = $value->created_at;

                $response[] = $res;
            }
            return response()->json($response);
        } else {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
    }

    /** 
     * Get LIsting for Patient Details
     */
    public function getQueuePatientListing(Request $request)
    {
        $offset = ($request->page - 1) * $request->per_page;
        $manager_id = $request->manager_id;
        
        $feedback = DB::table('feedback')
            ->select('id as feedback_id', 'patient_id as patient_id', 'clinic_id', 'customer_name', 'email', 'mobile', 'appointment_dt', 'appointment_type', 'appointment_status', 'imported_from')
            ->where('feedback.imported_from', 'Sycle')
            ->where('feedback.is_queue', '1')
            ->where('feedback.is_send_link', '0')
            ->where('feedback.user_id', $manager_id);

        if ($request->has('customer_name') && ($request->customer_name != '""')) {
            $feedback->where('customer_name', 'like', '%' . $request->customer_name . '%' );
        }

        if ($request->has('email') && ($request->email != '""')) {
            $feedback->where('email', 'like', '%' . $request->email . '%' );
        }

        if ($request->has('appointment_status') && ($request->appointment_status != '""')) {
            $feedback->where('appointment_status', $request->appointment_status);
        }

        if ($request->has('mobile') && ($request->mobile != '""')) {
            $feedback->where('mobile', 'like', '%' . $request->mobile . '%' );
        }

        $feedback->offset($offset)->limit($request->per_page);
        $result = $feedback->get();
        $response = array();
        
        foreach ($result as $key => $value) {
            $res = $value;
            $res->appointment_dt = date("m-d-Y H:i:s", strtotime($value->appointment_dt));
            $response[] = $res;
        }

        $total_record = $this->getRecordCount($request);

        if(!empty($response)) {
            return response()->json(['status' => 'success', 'per_page' => $request->per_page, 'page' => $request->page , 'total_record' => $total_record, 'data' =>  $response]);
        } else {
            return response()->json(['status' => 'success', 'data' =>  []]);
        }

        
    }

    public function getRecordCount($request)
    {
        $manager_id = $request->manager_id;

        $feedback = DB::table('feedback')
            ->select('id as feedback_id', 'patient_id as patient_id', 'clinic_id', 'customer_name', 'email', 'mobile', 'appointment_dt', DB::raw('"" as appointment_type'), 'appointment_status')
            ->where('feedback.imported_from', 'Sycle')
            ->where('feedback.is_queue', '1')
            ->where('feedback.is_send_link', '0')
            ->where('feedback.user_id', $manager_id);

        if ($request->has('customer_name') && ($request->customer_name != '""')) {
            $feedback->where('customer_name', 'like', '%' . $request->customer_name . '%' );
        }

        if ($request->has('email') && ($request->email != '""')) {
            $feedback->where('email', 'like', '%' . $request->email . '%' );
        }

        if ($request->has('appointment_status') && ($request->appointment_status != '""')) {
            $feedback->where('appointment_status', $request->appointment_status);
        }

        if ($request->has('mobile') && ($request->mobile != '""')) {
            $feedback->where('mobile', 'like', '%' . $request->mobile . '%' );
        }

        return $feedback->count();
    }


    /**
     * Remove multiple feedback option
     * @param Request $request
     * @return type
     */

    public function deletefeedback(Request $request)
    {
        /** validate data */
        $this->validate($request, [
            'feedback_ids' => 'required'
        ]);

        /**Only sycle user can delete check */
        if (!$this->currentUser->is_sycle_profile) {
            return response()->json(['status' => 'fail', 'message' => "You are not allowed to delete."]);
        }

        $feedbackIds = explode(",", $request->input('feedback_ids'));

        if (count($feedbackIds) > 0) {

            try {
                DB::beginTransaction();

                DB::table('feedback_send_link_log')
                    ->whereIn('feedback_id', function ($query) use ($feedbackIds) {
                        $query->select('id')->from('feedback')
                            ->whereIn('id', $feedbackIds)
                            ->where('organization_id', $this->organization->id);
                    })->delete();


                DB::table('feedback')
                    ->whereIn('id', $feedbackIds)
                    ->where('organization_id', $this->organization->id)
                    ->delete();

                DB::commit();

            } catch (Exception $e) {
                DB::rollBack();
            }
            return response()->json(['status' => 'success', 'message' => "Customer feedback deleted successfully."]);
    } else {
        return response()->json(['status' => 'fail', 'message' => "Invalid data."]);
    }
    } 
    /**
     * Remove feedback from clinic list
     * @param Request $request
     * @return type
     */


    public function removefrompatientListing(Request $request)
    {
        /** validate data */
        $this->validate($request, [
            'feedback_ids' => 'required'
        ]);

        /**Only sycle user can remove check */
        if (!$this->currentUser->is_sycle_profile) {
            return response()->json(['status' => 'fail', 'message' => "You are not allowed to remove from queue."]);
        }

        $feedbackIds = explode(",", $request->input('feedback_ids'));

        if (count($feedbackIds) > 0) {
            try {
                DB::beginTransaction();
                
                DB::table('feedback')
                    ->whereIn('id', $feedbackIds)
                    ->where('organization_id', $this->organization->id)
                    ->update(['is_queue' => 1]);

                DB::commit();
            } catch (Exception $e) {
                DB::rollBack();
            }
            return response()->json(['status' => 'success', 'message' => "Customer feedback removed successfully."]);
        }
        return response()->json(['status' => 'fail', 'message' => "Invalid data."]);
    }
}
