<?php

namespace App\Http\Controllers\Api\v2;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Exceptions\GeneralException;
use App\Http\Controllers\Controller;
use App\Repository\Auth\UserRepository;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Hash;

use App\Http\Controllers\API\BaseController as BaseController;
use App\Models\Questions;
use App\Models\Answers;
use App\Models\UserCalender;
use App\Models\UserCalenderPhase;
use App\Models\UserQuestionAnswer;
use App\Models\Category;
use App\Models\Symptom;
use App\Models\Phase;
use App\Models\CategorySymptom;
use App\Models\Auth\User;
use Validator;
use Carbon\Carbon;


class ApiButtonController extends Controller
{
     public function __construct()
    {
        $this->url = url('storage/images/users/api/');
    }
    

    public function startButton(Request $request)
    {
        $response = array();
        $output = array();

        $inputs = $request->all();
        $inputs = getTrimmedValue($inputs);

        $user_id = trim($request->input('user_id'));
        $start_date = date('Y-m-d');
        $starting_date = date('Y-m-d');
        

        if($user_id && $start_date)
        {
            $getUserCalender = UserCalender::where('user_id',$user_id)->whereDate('sdate', '<=', $start_date)->whereDate('edate', '>=', $start_date)->first();
            $getUserCalenderCount = UserCalender::where('user_id',$user_id)->whereDate('sdate', '<=', $start_date)->whereDate('edate', '>=', $start_date)->count();
            // dd($getUserCalender);
            $avg = UserCalender::where('user_id',$user_id)->avg('duration');
            $totalDays = ceil($avg);
            $phase = 4;
            $day = 1;
            $tdate = $totalDays - $day;
            
            $edate = date('Y-m-d', strtotime($start_date. ' + '.$tdate.' days'));

            if($getUserCalenderCount > 0)
            {
                $lastExistCalenderStartDate = Carbon::parse($getUserCalender->sdate); 
                $lastExistCalenderDate = Carbon::parse(date('Y-m-d', strtotime($start_date. ' - '.$day.' days'))); 
                $diff_day     = $lastExistCalenderStartDate->diffInDays($lastExistCalenderDate);

                // $userC = UserCalender::find($getUserCalender->id);
                $userC = UserCalender::where('id', $getUserCalender->id)
                        ->update(['edate' => $lastExistCalenderDate, 'duration'=>$diff_day]);
                $avg = UserCalender::where('user_id',$user_id)->avg('duration');
                $totalDays = ceil($avg);
                // $totalDays = ceil(($totalDay + $diff_day)/2);
                $phase = 4;
                $day = 1;
                $tdate = $totalDays - $day;
                $edate = date('Y-m-d', strtotime($start_date. ' + '.$tdate.' days'));
                if($userC)
                {
                    $getUserCalenderPhase = UserCalenderPhase::where('user_calender_id', $getUserCalender->id)->get();

                    if(count($getUserCalenderPhase) > 0)
                    {
                        $forthPhaseStartDate = Carbon::parse($getUserCalenderPhase[3]->phase_sdate);
                        $diff_day_phase = $forthPhaseStartDate->diffInDays($lastExistCalenderDate);

                        $userCP = UserCalenderPhase::where('id', $getUserCalenderPhase[3]->id)
                                  ->update(['phase_edate' => $lastExistCalenderDate, 'phase_duration'=>$diff_day_phase]);
                        
                        
                        if($userCP)
                        {
                            
                            $calender = new UserCalender;
                            $calender->user_id = $user_id;
                            $calender->sdate = $start_date;
                            $calender->edate = $edate;
                            $calender->duration = $totalDays;
                            $calender->status = 1;
                                                
                            if($calender->save())
                            {
                                if($totalDays < 21)
                                {
                                    $p = Phase::where('duration', 21)->first();   
                                    $q = Phase::where('duration', 21)->count();   
                                }
                                elseif($totalDays > 35)
                                {
                                    $p = Phase::where('duration', 35)->first();    
                                    $q = Phase::where('duration', 35)->count();    
                                }
                                else
                                {
                                    $p = Phase::where('duration', $totalDays)->first(); 
                                    $q = Phase::where('duration', $totalDays)->count(); 
                                }
                                
                                if($q > 0)
                                {

                                    $phase_1 = $phase-$day;
                                    $phase_2 = $p->phase_two;
                                    $phase_3 = $p->phase_three;
                                    $last_phase = ($totalDays - ($phase + $phase_2 + $phase_3));
                                    // dd($last_phase);
                                    
                                    for($i=0; $i<$phase;$i++)
                                    {

                                        if($i == 0) 
                                        {
                                            
                                         $start_date = date('Y-m-d', strtotime($start_date));
                                         $end_date = date('Y-m-d', strtotime($start_date. ' + '.$phase_1.' days'));
                                         $phase_color = 'clear';
                                         $instCalenderPhase = UserCalenderPhase::insert([
                                                    'user_calender_id'=>$calender->id,
                                                    'phase_no'=>$i+1,
                                                    'phase_sdate'=>$start_date,
                                                    'phase_edate'=>$end_date,
                                                    'phase_duration'=>$phase,
                                                    'phase_color'=>$phase_color
                                                ]);
                                        } 
                                        elseif($i == 1) 
                                        {
                                            
                                         $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                                         $end_date = date('Y-m-d', strtotime($end_date. ' + '.$phase_2.' days'));
                                         $phase_color = 'yellow';
                                         $instCalenderPhase = UserCalenderPhase::insert([
                                                    'user_calender_id'=>$calender->id,
                                                    'phase_no'=>$i+1,
                                                    'phase_sdate'=>$start_date,
                                                    'phase_edate'=>$end_date,
                                                    'phase_duration'=>$phase_2,
                                                    'phase_color'=>$phase_color
                                                ]);
                                        } 
                                        elseif($i == 2) 
                                        {
                                            
                                         $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                                         $end_date = date('Y-m-d', strtotime($end_date. ' + '.$phase_3.' days'));
                                         $phase_color = 'orange';
                                         $instCalenderPhase = UserCalenderPhase::insert([
                                                    'user_calender_id'=>$calender->id,
                                                    'phase_no'=>$i+1,
                                                    'phase_sdate'=>$start_date,
                                                    'phase_edate'=>$end_date,
                                                    'phase_duration'=>$phase_3,
                                                    'phase_color'=>$phase_color
                                                ]);
                                        }
                                        else 
                                        {
                                            
                                         $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                                         $end_date = date('Y-m-d', strtotime($end_date. ' + '.$last_phase.' days'));
                                         $phase_color = 'red';
                                         $instCalenderPhase = UserCalenderPhase::insert([
                                                    'user_calender_id'=>$calender->id,
                                                    'phase_no'=>$i+1,
                                                    'phase_sdate'=>$start_date,
                                                    'phase_edate'=>$end_date,
                                                    'phase_duration'=>$last_phase,
                                                    'phase_color'=>$phase_color
                                                ]);
                                        }

                                        if($instCalenderPhase)
                                        {
                                            $calenderSymptom = CategorySymptom::where('user_id',$user_id)->where('date', $starting_date)->get();
                                            // dd($calenderSymptom);
                                            if(count($calenderSymptom) > 0)
                                            {
                                               $upd = CategorySymptom::where('user_id',$user_id)->where('date', $starting_date)->update(['calender_id' => $calender->id]); 
                                            }                                           
                                            
    
                                
                                            $status = 200;
                                            $statusCode = 200;
                                            $message = "Data Insert Successful";

                                            $userDetails = User::find($user_id);

                                            $output['id'] = $userDetails->id??'';
                                            $output['name'] = $userDetails->name??'';
                                            $output['dob'] = $userDetails->dob?date('d-m-Y', strtotime($userDetails->dob)):'';
                                            $output['email'] = $userDetails->email??'';
                                            $output['email_verified_at'] = $userDetails->email_verified_at??'';
                                            $output['avatar_location'] = $this->url.$userDetails->avatar_location??'';
                                            $output['device_token'] = $userDetails->device_token??'';
                                            $output['device_type'] = $userDetails->device_type??'';
                                            $output['mobile_country_code'] = $userDetails->mobile_country_code??'';
                                            $output['mobile_number'] = $userDetails->mobile_number??'';
                                            $output['mobile_verification_code'] = $userDetails->mobile_verification_code??'';
                                            $output['email_verification_code'] = $userDetails->email_verification_code??'';
                                            $output['status'] = $userDetails->status??'';
                                            $output['login_type'] = $userDetails->login_type??'';
                                            $output['email_verify'] = $userDetails->email_verify??'';
                                            $output['mobile_verify'] = $userDetails->mobile_verify??'';
                                            $output['questionneres'] = $userDetails->questionneres??'';
                                            $output['session_token'] = $userDetails->session_token??'';
                                            $output['created_at'] = $userDetails->created_at->toDateString()??'';
                                            $output['updated_at'] = $userDetails->updated_at->toDateString()??'';
                                            $output['user_calender_status'] = $calender->status??'';

                                            $output['inputs'] = $inputs??(object)[];
                                        }
                                        else
                                        {
                                            $status = 201;
                                            $statusCode = 201;
                                            $message = "Calender Phase Data Not Intersed";
                                        }
                                        
                                    }
                                }
                                else
                                {
                                    $status = 201;
                                    $statusCode = 201;
                                    $message = "No Data Found";
                                }
                            }
                            else
                            {
                                $status = 201;
                                $statusCode = 201;
                                $message = "Calender Data Not Intersed";
                            }
                        }
                        else
                        {
                            $status = 201;
                            $statusCode = 201;
                            $message = "No Phase Calender Data Updated";
                        }

                    }
                    else
                    {
                        $status = 201;
                        $statusCode = 201;
                        $message = "No Phase Calender Data Found";
                    }
                }
                else
                {
                    $status = 201;
                    $statusCode = 201;
                    $message = "No Calender Data Updated";
                }
                
            }
            else
            {
                $calender = new UserCalender;
                $calender->user_id = $user_id;
                $calender->sdate = $start_date;
                $calender->edate = $edate;
                $calender->duration = $totalDays;
                $calender->status = 1;
                                    
                if($calender->save())
                {
                    if($totalDays < 21)
                    {
                        $p = Phase::where('duration', 21)->first();   
                        $q = Phase::where('duration', 21)->count();   
                    }
                    elseif($totalDays > 35)
                    {
                        $p = Phase::where('duration', 35)->first();    
                        $q = Phase::where('duration', 35)->count();    
                    }
                    else
                    {
                        $p = Phase::where('duration', $totalDays)->first(); 
                        $q = Phase::where('duration', $totalDays)->count(); 
                    }
                    
                    if($q > 0)
                    {

                        $phase_1 = $phase-$day;
                        $phase_2 = $p->phase_two;
                        $phase_3 = $p->phase_three;
                        $last_phase = ($totalDays - ($phase + $phase_2 + $phase_3));
                        // dd($last_phase);
                        
                        for($i=0; $i<$phase;$i++)
                        {

                            if($i == 0) 
                            {
                                
                             $start_date = date('Y-m-d', strtotime($start_date));
                             $end_date = date('Y-m-d', strtotime($start_date. ' + '.$phase_1.' days'));
                             $phase_color = 'clear';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$phase,
                                        'phase_color'=>$phase_color
                                    ]);
                            } 
                            elseif($i == 1) 
                            {
                                
                             $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                             $end_date = date('Y-m-d', strtotime($end_date. ' + '.$phase_2.' days'));
                             $phase_color = 'yellow';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$phase_2,
                                        'phase_color'=>$phase_color
                                    ]);
                            } 
                            elseif($i == 2) 
                            {
                                
                             $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                             $end_date = date('Y-m-d', strtotime($end_date. ' + '.$phase_3.' days'));
                             $phase_color = 'orange';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$phase_3,
                                        'phase_color'=>$phase_color
                                    ]);
                            }
                            else 
                            {
                                
                             $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                             $end_date = date('Y-m-d', strtotime($end_date. ' + '.$last_phase.' days'));
                             $phase_color = 'red';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$last_phase,
                                        'phase_color'=>$phase_color
                                    ]);
                            }

                            if($instCalenderPhase)
                            {                    
                                $status = 200;
                                $statusCode = 200;
                                $message = "Data Insert Successful";

                                $userDetails = User::find($user_id);

                                $output['id'] = $userDetails->id??'';
                                $output['name'] = $userDetails->name??'';
                                $output['dob'] = $userDetails->dob?date('d-m-Y', strtotime($userDetails->dob)):'';
                                $output['email'] = $userDetails->email??'';
                                $output['email_verified_at'] = $userDetails->email_verified_at??'';
                                $output['avatar_location'] = $this->url.$userDetails->avatar_location??'';
                                $output['device_token'] = $userDetails->device_token??'';
                                $output['device_type'] = $userDetails->device_type??'';
                                $output['mobile_country_code'] = $userDetails->mobile_country_code??'';
                                $output['mobile_number'] = $userDetails->mobile_number??'';
                                $output['mobile_verification_code'] = $userDetails->mobile_verification_code??'';
                                $output['email_verification_code'] = $userDetails->email_verification_code??'';
                                $output['status'] = $userDetails->status??'';
                                $output['login_type'] = $userDetails->login_type??'';
                                $output['email_verify'] = $userDetails->email_verify??'';
                                $output['mobile_verify'] = $userDetails->mobile_verify??'';
                                $output['questionneres'] = $userDetails->questionneres??'';
                                $output['session_token'] = $userDetails->session_token??'';
                                $output['created_at'] = $userDetails->created_at->toDateString()??'';
                                $output['updated_at'] = $userDetails->updated_at->toDateString()??'';

                                $output['inputs'] = $inputs??(object)[];
                            }
                            else
                            {
                                $status = 201;
                                $statusCode = 201;
                                $message = "Calender Phase Data Not Intersed";
                            }
                            
                        }
                    }
                    else
                    {
                        $status = 201;
                        $statusCode = 201;
                        $message = "No Data Found";
                    }
                }
                else
                {
                    $status = 201;
                    $statusCode = 201;
                    $message = "Calender Data Not Intersed";
                }
            }
            

            
                
        }
        else
        {
            $status = 201;
            $statusCode = 201;
            $message = "Please Fill The Required Fields";
        }

        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);        
    }


    public function stopButton(Request $request)
    {
        $response = array();
        $output = array();

        $inputs = $request->all();
        $inputs = getTrimmedValue($inputs);

        $user_id = trim($request->input('user_id'));
        $starting_date = date('Y-m-d');
        
        if($user_id && $starting_date)
        {
            $getUserCalender = UserCalender::where('user_id',$user_id)->where('status', 1)->where('sdate', '<=', $starting_date)->where('edate', '>=', $starting_date)->first();
            $getUserCalenderCount = UserCalender::where('user_id',$user_id)->where('status', 1)->where('sdate', '<=', $starting_date)->where('edate', '>=', $starting_date)->count();
            
            // dd($getUserCalender);
            if($getUserCalenderCount > 0)
            {
                $avg = UserCalender::where('user_id',$user_id)->avg('duration');
                $totalDays = ceil($avg);
                $day = 1;
                $tdate = $totalDays - $day;
                $startDate = Carbon::parse(date('Y-m-d', strtotime($getUserCalender->sdate))); 
                $firstPhaseEndDate = Carbon::parse(date('Y-m-d', strtotime($starting_date)));
                $dates = [];
                $phase = $startDate->diffInDays($firstPhaseEndDate); 
                $phase = $phase + $day;
                $edate = date('Y-m-d', strtotime($startDate. ' + '.$tdate.' days'));
                
                for($i=0; $i<$totalDays; $i++)
                {
                    $all_dates = Carbon::parse($getUserCalender->sdate)->addDays($i);
                    array_push($dates, $all_dates);    
                }
                

                $userCalenderDelete = UserCalender::where('id', $getUserCalender->id)->delete();
                $userCalenderPhaseDelete = UserCalenderPhase::where('user_calender_id', $getUserCalender->id)->delete();

                $calender = new UserCalender;
                            $calender->user_id = $user_id;
                            $calender->sdate   = $startDate;
                            $calender->edate   = $edate;
                            $calender->duration= $totalDays;
                            $calender->status = 0;

                if($calender->save())
                {
                    if($totalDays < 21)
                    {
                        $p = Phase::where('duration', 21)->first();   
                        $q = Phase::where('duration', 21)->count();   
                    }
                    elseif($totalDays > 35)
                    {
                        $p = Phase::where('duration', 35)->first();    
                        $q = Phase::where('duration', 35)->count();    
                    }
                    else
                    {
                        $p = Phase::where('duration', $totalDays)->first(); 
                        $q = Phase::where('duration', $totalDays)->count(); 
                    }
                    if($q > 0)
                    {
                        $duration = $totalDays;
                        $phase_1 = $phase-$day;
                        $phase_2 = $p->phase_two;
                        $phase_3 = $p->phase_three;
                        $last_phase = ($duration - ($phase + $phase_2 + $phase_3));

                        for($i=0; $i<4;$i++)
                        {

                            if($i == 0) 
                            {
                                
                             $start_date = $getUserCalender->sdate;
                             $end_date = date('Y-m-d', strtotime($start_date. ' + '.$phase_1.' days'));
                             $phase_color = 'clear';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$phase,
                                        'phase_color'=>$phase_color
                                    ]);
                            } 
                            elseif($i == 1) 
                            {
                                
                             $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                             $end_date = date('Y-m-d', strtotime($end_date. ' + '.$phase_2.' days'));
                             $phase_color = 'yellow';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$phase_2,
                                        'phase_color'=>$phase_color
                                    ]);
                            } 
                            elseif($i == 2) 
                            {
                                
                             $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                             $end_date = date('Y-m-d', strtotime($end_date. ' + '.$phase_3.' days'));
                             // dd($each_phase);
                             $phase_color = 'orange';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$phase_3,
                                        'phase_color'=>$phase_color
                                    ]);
                            }
                            else 
                            {
                                
                             $start_date = date('Y-m-d', strtotime($end_date. ' + '.$day.' days'));
                             $end_date = date('Y-m-d', strtotime($end_date. ' + '.$last_phase.' days'));
                             $phase_color = 'red';
                             $instCalenderPhase = UserCalenderPhase::insert([
                                        'user_calender_id'=>$calender->id,
                                        'phase_no'=>$i+1,
                                        'phase_sdate'=>$start_date,
                                        'phase_edate'=>$end_date,
                                        'phase_duration'=>$last_phase,
                                        'phase_color'=>$phase_color
                                    ]);
                            }

                            if($instCalenderPhase)
                            {
                                
                                foreach ($dates as $key => $value) 
                                {
                                    $givenD = date('Y-m-d', strtotime($value));
                                    $getUserCalender = UserCalender::where('user_id',$inputs['user_id'])->whereDate('sdate', '<=', $givenD)->whereDate('edate', '>=', $givenD)->first();
                                    $getUserCalenderPhase = CategorySymptom::where('user_id',$inputs['user_id'])->where('date', $givenD)->first();
                                    if($getUserCalender && $getUserCalenderPhase)
                                    {
                                        $upd = CategorySymptom::where('user_id',$inputs['user_id'])->where('date', $givenD)->update(['calender_id' => $getUserCalender->id]);

                                    }
                                }
                                                                
                                $status = 200;
                                $statusCode = 200;
                                $message = "Data Insert Successful";

                                $userDetails = User::find($user_id);

                                $output['id'] = $userDetails->id??'';
                                $output['name'] = $userDetails->name??'';
                                $output['dob'] = $userDetails->dob?date('d-m-Y', strtotime($userDetails->dob)):'';
                                $output['email'] = $userDetails->email??'';
                                $output['email_verified_at'] = $userDetails->email_verified_at??'';
                                $output['avatar_location'] = $userDetails->avatar_location?getImgPath('users', $userDetails->avatar_location, 'api'):'';
                                $output['device_token'] = $userDetails->device_token??'';
                                $output['device_type'] = $userDetails->device_type??'';
                                $output['mobile_country_code'] = $userDetails->mobile_country_code??'';
                                $output['mobile_number'] = $userDetails->mobile_number??'';
                                $output['mobile_verification_code'] = $userDetails->mobile_verification_code??'';
                                $output['email_verification_code'] = $userDetails->email_verification_code??'';
                                $output['status'] = $userDetails->status??'';
                                $output['login_type'] = $userDetails->login_type??'';
                                $output['email_verify'] = $userDetails->email_verify??'';
                                $output['mobile_verify'] = $userDetails->mobile_verify??'';
                                $output['questionneres'] = $userDetails->questionneres??'';
                                $output['session_token'] = $userDetails->session_token??'';
                                $output['created_at'] = $userDetails->created_at->toDateString()??'';
                                $output['updated_at'] = $userDetails->updated_at->toDateString()??'';
                                $output['user_calender_status'] = $calender->status??'';

                                $output['inputs'] = $inputs??(object)[];
                                
                            }
                            else
                            {
                                $status = 201;
                                $statusCode = 201;
                                $message = "Calender Phase Data Not Intersed";
                            }
                            
                        }
                    }
                    else
                    {
                        $status = 201;
                        $statusCode = 201;
                        $message = "No Data Found";
                    }                      
                        
                }
                else
                {
                    $status = 201;
                    $statusCode = 201;
                    $message = "Calender Data Not Intersed";
                }


            }
            else
            {
                $status = 201;
                $statusCode = 201;
                $message = "No Calender Data Found";
            }
                
        }
        else
        {
            $status = 201;
            $statusCode = 201;
            $message = "Please Fill The Required Fields";
        }

        $response = array('status'=>$status, 'message'=>$message, 'result'=>$output);
        
        return response()->json($response);        
    }
   


    

   
    
   
}
