<?php

namespace App\Http\Controllers\serverExport;

use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

use Validator;
use Carbon\Carbon;

use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Facades\Excel;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use App\Exports\Export_age;
use App\Exports\MME_Export\Reception\ReceptionExport;
use App\Exports\MME_Export\Lab\LabExport;
use App\Exports\RiskbackExcel\RefillRisk;
use App\Helper\ExportHelper;
use App\Http\Controllers\Controller;
//use App\Exports\RefillRisk;
use DateTime;


class ReceptionController extends Controller
{
	//new Ncd view
	protected $DB;

    public function __construct() {
        $this->DB = (new ExportHelper())->DB;
    }
	protected $final_risklog = [];
	protected	$final_log = [];

	public function Reception_Export(Request $request)
	{
		// Increase memory limit to 1GB
		$vdate = "Visit Date";
		$dob = "Date of Birth";
		$export_data = collect([]);

		$modelClassName = "App\\Models\\Followup_general"; // extend model
		$model = app()->make($modelClassName); // resolves the model from the service container.
		foreach ($request["clinics"] as $clinic) {
			$model->setConnection($this->DB[$clinic]);
			$users = $model
				->whereBetween("Visit Date", [$request["From_date"], $request["To_date"]])
				->where("preCode", "!=", "1")
				->leftJoin("patients", "patients.Pid", "=", "followup_generals.Pid")
				->select("followup_generals.*", "Date of Birth", "patients.Agey", "patients.Agem", "patients.Gender", "patients.FuchiaID", "patients.Main Risk", "patients.Sub Risk", "patients.Eyes_code", 'Risk Log', 'Risk Change_Date', 'Former Risk')
				->get();
			$export_data = $export_data->merge($users);
		}



		$Dates_excel = ["Next Appointment Date", "Visit Date"];
		$Decrypt_excel = ["Main Risk", "Sub Risk", "Gender", "Fever", "MUAC"];
		$diagnosis_dataonly = [
			"phacheck",
			"pha_new_old",
			"pha_cohort", //0
			"artcheck",
			"art_new_old",
			"art_cohort", //1
			"prepcheck",
			"prep_new_old", //2
			"pmtctcheck",
			"pmtct_new_old", //3
			"anccheck",
			"anc_new_old", //4
			"fmaplancheck",
			"famaplan_new_old", //5
			"gneralcheck",
			"general_new_old",
			"general_diagnosis",
			"OPD", //6
			"ncdcheck",
			"ncd_new_old",
			"ncd_diagnosis",
			"ncd_drugSupply", //7
			"hivTBcheck",
			"hivTB_new_old", //8
			"fcentercheck",
			"feedcentre_new_old", //9
			"labInvestcheck",
			"labInvest_new_old", //10
		]; // 27

		$diagnosisArray = [];
		foreach ($export_data as $index => $export) {
			$counting = 0;

			$diaString = $export["Pateint_Diagnosis"];

			if ($diaString != null && $diaString != "" && $diaString != 731) {
				$diagnosis_cut = explode("/", $diaString);
				for ($i = 0; $i < 11; $i++) {
					$diagnosis_name = explode("-", $diagnosis_cut[$i]);
					for ($j = 0; $j < count($diagnosis_name); $j++) {
						if (Str::contains($diagnosis_name[$j], "\\")) {
							$diagnosis_name[$j] = trim($diagnosis_name[$j], "\\");
						}
						if ($diagnosis_name[$j] == "731") {
							$diagnosis_final[$diagnosis_dataonly[$counting]] = "";
						} else {
							$diagnosis_final[$diagnosis_dataonly[$counting]] = Crypt::decrypt_light($diagnosis_name[$j], 'General'); //decrpting all diagnosis and adding new object array
						}

						

						if ($diagnosis_final[$diagnosis_dataonly[$counting]] == "hivTBcheck") {
								$diagnosis_final[$diagnosis_dataonly[$counting]] = "hiv(Neg)-TBcheck";
						}
						if($diagnosis_final[$diagnosis_dataonly[$counting]]=='artcheck'){
							
								$diagnosis_final['phacheck'] = $diagnosis_final['artcheck'];
								//$diagnosis_final['pha_new_old'] = $diagnosis_final['art_new_old'];
								//$diagnosis_final['pha_cohort'] = $diagnosis_final["art_cohort"];
							Log::info($diagnosis_final);
							// Log::info($diagnosis_final[$diagnosis_dataonly[$counting]]);
							 
							 
							
						}
						if($diagnosis_final[$diagnosis_dataonly[$counting]]=='art_new_old'){
							$diagnosis_final['pha_new_old'] = $diagnosis_final['art_new_old'];
						}
						
						

						if ($diagnosis_final[$diagnosis_dataonly[$counting]] == "false") {
							$diagnosis_final[$diagnosis_dataonly[$counting]] = "";
						}
						if ($i == 6 && count($diagnosis_name) == 3 && $j == 2) {
							$counting += 2;
						} else {
							$counting++;
						}
					}
					$diagnosisArray = $diagnosis_final;
				}
			} else {
				for ($i = 0; $i < count($diagnosis_dataonly); $i++) {
					$diagnosisArray[$diagnosis_dataonly[$i]] = "";
				}
			}
			$export = Export_age::Export_general($export, $export["Visit Date"], $export["Date of Birth"], $export);
			
			if ($export["Date of Birth"] == null) {
				$export = ExportHelper::NoCofidential($export, $export["Visit Date"]);
			}
			if ($export["Risk Log"] != null) {
				$carbonDate = Carbon::createFromFormat('Y-m-d', $export['Visit Date']);
				$carbonDate = Carbon::createFromFormat('d-m-Y', $carbonDate->format('d-m-Y'));
				$vdate = new DateTime($carbonDate);
				$forRiskCheck[1]['Pid'] = $export['Pid'];
				$forRiskCheck[1]['Risk Log'] = $export['Risk Log'];
				if (!array_key_exists($export['Pid'], $this->final_log) && $export['Risk Log'] != null) {
					$this->final_risklog = RefillRisk::FillRisk($forRiskCheck);
					$this->final_log[$export['Pid']] = $this->final_risklog;
				}
				if (array_key_exists($export['Pid'], $this->final_log)) {
					foreach (array_reverse($this->final_log[$export['Pid']][$export['Pid']]) as $date => $data) {
						if (strlen($date) == 10) {
							$riskChangeDate = new DateTime($date);
							if ($vdate < $riskChangeDate) {
								$export['Main Risk'] = Crypt::encrypt_light($data['Old Risk'], 'General');
								$export['Sub Risk'] = Crypt::encrypt_light($data['Old Sub Risk'], 'General');
							}
						}
					}
				}
			} elseif ($export['Former Risk'] != null && $export['Former Risk'] != "731" && $export['Risk Change_Date'] != null) {
				$riskChangeDate = Carbon::createFromFormat('Y-m-d', $export['Risk Change_Date']);
				$riskChangeDate = new DateTime(Carbon::createFromFormat('d-m-Y', $riskChangeDate->format('d-m-Y')));
				if ($vdate < $riskChangeDate) {
					$export['Main Risk'] = $export['Former Risk'];
					$export['Sub Risk'] = '';
				}
			}
			foreach ($Dates_excel as $Date_excel) {
				if ($export[$Date_excel] != null) {
					$carbonDate = Carbon::createFromFormat("Y-m-d", $export[$Date_excel]);
					$carbonDate = Carbon::createFromFormat("d-m-Y", $carbonDate->format("d-m-Y"));
					$export[$Date_excel] = Date::dateTimeToExcel($carbonDate->startOfDay());
				}
			}
			foreach ($Decrypt_excel as $decrypt_excel) {

				$export[$decrypt_excel] = Crypt::decrypt_light($export[$decrypt_excel], 'General');
				if (($decrypt_excel == "Main Risk" || $decrypt_excel == "Sub Risk") && $export[$decrypt_excel] == "-") {
					$export[$decrypt_excel] = null;
				}

				$export[$decrypt_excel] = Crypt::codeBook($export[$decrypt_excel], "encode");
			}
			if (!array_key_exists("OPD", $diagnosisArray)) {
				$diagnosisArray["OPD"] = "";
			}
			$export["cervicalCancer"] = Crypt::decrypt_light($export["cervicalCancer"], "General");
			$export["cervicalCancer_new_old"] = Crypt::decrypt_light($export["cervicalCancer_new_old"], "General");
			$export["Diagnosis_data"] = $diagnosisArray;
		}
		return Excel::download(new ReceptionExport($export_data), "FollowUP_Export-" . date("d-m-Y") . "." . $request["typeExport"]);
	}
}
