<?php

namespace App\Http\Controllers\Capture;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use MongoDB\Client;
use App\Imports\CaseImport;

class UploadController extends Controller
{
    public function index()
    {
        return view('upload.index'); // หน้า form สำหรับ upload
    }

    public function import(Request $request)
    {
        if (!$request->hasFile('file')) {
            return back()->with('error', 'กรุณาเลือกไฟล์ที่ต้องการอัพโหลด');
        }

        $request->validate([
            'file' => 'required|mimes:xlsx,xls',
        ]);

        try {
            $file = $request->file('file');

            if (!$file || !$file->isValid()) {
                return back()->with('error', 'ไฟล์ไม่ถูกต้องหรือเสียหาย');
            }

            $fileName = time() . '_' . $file->getClientOriginalName();


            if (empty($fileName)) {
                return back()->with('error', 'ชื่อไฟล์ไม่ถูกต้อง');
            }


            $tempPath = storage_path('app/temp');
            if (!file_exists($tempPath)) {
                if (!mkdir($tempPath, 0777, true)) {
                    return back()->with('error', 'ไม่สามารถสร้างโฟลเดอร์ temp ได้');
                }
            }

            if (!is_writable($tempPath)) {
                return back()->with('error', 'ไม่มีสิทธิ์ในการเขียนไฟล์ในโฟลเดอร์ temp');
            }

            try {
                $path = $file->move($tempPath, $fileName);
                if (!$path) {
                    return back()->with('error', 'ไม่สามารถย้ายไฟล์ได้');
                }
            } catch (\Exception $e) {
                return back()->with('error', 'เกิดข้อผิดพลาดในการบันทึกไฟล์: ' . $e->getMessage());
            }

            if (!file_exists($path)) {
                return back()->with('error', 'ไม่พบไฟล์หลังจากการบันทึก');
            }

            $import = new CaseImport();
            Excel::import($import, $path);


            \Log::info('Data before MongoDB:', ['count' => count($import->data), 'sample' => array_slice($import->data, 0, 1)]);


            try {
                $client = new Client("mongodb://localhost:27017");
                $database = $client->screening;

                // บันทึกข้อมูลลง tb_patient
                $patientCollection = $database->tb_patient;
                if (!empty($import->data)) {
                    $dataToInsert = array_map(function($item) {
                        return array_map(function($value) {
                            return is_object($value) ? (string)$value : $value;
                        }, $item);
                    }, $import->data);

                    $patientCollection->insertMany($dataToInsert);
                }

                // บันทึกข้อมูลลง tb_case
                $caseCollection = $database->tb_case;
                if (!empty($import->case_data)) {
                    $caseDataToInsert = array_map(function($item) {
                        return array_map(function($value) {
                            return is_object($value) ? (string)$value : $value;
                        }, $item);
                    }, $import->case_data);

                    $caseCollection->insertMany($caseDataToInsert);
                }

            } catch (\Exception $e) {
                \Log::error('MongoDB Error:', ['error' => $e->getMessage()]);
                return back()->with('error', 'เกิดข้อผิดพลาดในการเชื่อมต่อ MongoDB: ' . $e->getMessage());
            }

            unlink($path);
            return back()->with('success', 'นำเข้าข้อมูลสำเร็จ');

        } catch (\Exception $e) {
            return back()->with('error', 'เกิดข้อผิดพลาด: ' . $e->getMessage());
        }
    }

    public function importPatient(Request $request)
    {
        if (!$request->hasFile('file')) {
            return redirect()->back()->with('error', 'กรุณาเลือกไฟล์ที่ต้องการอัพโหลด');
        }

        $request->validate([
            'file' => 'required|mimes:xlsx,xls',
        ]);

        try {
            $file = $request->file('file');


            $originalName = $file->getClientOriginalName();
            if (empty($originalName)) {
                return back()->with('error', 'ไม่พบชื่อไฟล์ที่ถูกต้อง');
            }
            $fileName = time() . '_' . $originalName;
            $path = $file->storeAs('temp', $fileName);


            $import = new \App\Imports\CaseImport();
            Excel::import($import, storage_path('app/' . $path));


            unlink(storage_path('app/' . $path));


            $client = new Client(env('MONGODB_URI'));
            $collection = $client->selectDatabase(env('DB_DATABASE'))->selectCollection('tb_patient');

            foreach ($import->data as $row) {
                $document = array_merge($row, [
                    'created_at' => now(),
                    'updated_at' => now(),
                ]);

                $collection->insertOne($document);
            }

            return back()->with('success', 'นำเข้าข้อมูลผู้ป่วยสำเร็จ');

        } catch (\Exception $e) {
            return back()->with('error', 'เกิดข้อผิดพลาด: ' . $e->getMessage());
        }

    }

}
