<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\GeneticDisease;
use App\Models\GeneticDiseaseVariant;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\JsonResponse;
use Yajra\DataTables\Facades\DataTables;

class GeneticDiseaseController extends Controller
{
    public function index()
    {
        $geneticDiseases = GeneticDisease::orderBy('created_at', 'desc')->get();

        return view('admin.genetic_diseases.index', compact('geneticDiseases'));
    }

    public function getGeneticDiseaseList(Request $request)
    {
        $sqlBuilder = GeneticDisease::select([
            'genetic_diseases.id',
            'genetic_diseases.name',
            'genetic_diseases.name_ar',
            'genetic_diseases.status',
        ]);

        return DataTables::of($sqlBuilder)
            ->filter(function ($query) use ($request) {
                if ($request->has('search') && !empty($request->search['value'])) {
                    $query->where('genetic_diseases.name', 'ilike', "%" . $request->search['value'] . "%")
                    ->orWhere('genetic_diseases.name_ar', 'ilike', "%" . $request->search['value'] . "%");
                }
            })
            ->editColumn('status', function ($data) {
                return '<div class="status">
                <div class="form-check form-switch ">
                    <input class="form-check-input status-checkbox" type="checkbox" role="switch" id="SwitchCheck4" data-url="' . route('admin.genetic_diseases.status', ['id' => $data->id]) . '" data-id="' . $data->id . '" ' . (!empty($data->status) && $data->status == 1 ? 'checked' : '') . ' />
                </div>
            </div>';
            })
            ->addColumn('action', function ($data) {
                $html = '<div class="dropdown">
                                        <a href="#" class="btn btn-soft-secondary btn-sm" role="button" id="dropdownMenuLink5" data-bs-toggle="dropdown" aria-expanded="false">
                                            <i class="ri-more-2-fill"></i>
                                        </a>
                                        <ul class="dropdown-menu" aria-labelledby="dropdownMenuLink5">
                                            <li><a class="dropdown-item" href="' . route('admin.genetic_diseases.edit', ['id' => $data->id]) . '">Edit</a></li>
                                            <li><a class="dropdown-item delete-btn" data-url="' . route('admin.genetic_diseases.destroy', ['id' => $data->id]) . '">Delete</a></li>
                                        </ul>
                                    </div>';
                return $html;
            })
            ->rawColumns(['status', 'action'])
            ->make(true);
    }

    public function create()
    {
        $geneticDisease = "";

        return view('admin.genetic_diseases.create', compact('geneticDisease'));
    }

    public function store(Request $request)
    {
        $rules = [
            'name' => 'required|string|max:255',
            'name_ar' => 'required|string|max:255',
            'status' => 'required|in:0,1',
            'variants' => 'nullable|array',
            'variants.*.name' => 'string|max:255',
            'variants.*.name_ar' => 'string|max:255',
        ];

        $validator = Validator::make($request->all(), $rules);

        if ($validator->fails()) {
            return response()->json([
                'status' => 'error',
                'errors' => $validator->errors(),
            ], 422);
        }

        if ($request->id) {
            $geneticDisease = GeneticDisease::find($request->id);

            if (!$geneticDisease) {
                return response()->json(['status' => 'error', 'message' => 'Genetic Disease not found'], 404);
            }

            $geneticDisease->name = $request->name;
            $geneticDisease->name_ar = $request->name_ar;
            $geneticDisease->status = $request->status;
            $geneticDisease->save();

            if ($request->has('variants') && is_array($request->variants)) {
                $ceratedRecords = [];
                foreach ($request->variants as $variant) {
                    if(isset($variant['id']) && $variant['id']) {
                        $existingVariant = GeneticDiseaseVariant::find($variant['id']);
                        if ($existingVariant) {
                            $existingVariant->name = $variant['name'];
                            $existingVariant->name_ar = $variant['name_ar'];
                            $existingVariant->save();
                            $ceratedRecords[] = $existingVariant->id;
                        }
                    } else {
                        $recordCreated = GeneticDiseaseVariant::create([
                            'name' => $variant['name'],
                            'name_ar' => $variant['name_ar'],
                            'genetic_disease_id' => $geneticDisease->id,
                        ]);
                        $ceratedRecords[] = $recordCreated->id;
                    }
                }
                GeneticDiseaseVariant::where('genetic_disease_id', $geneticDisease->id)
                        ->whereNotIn('id', $ceratedRecords)
                        ->delete();
            }

            return response()->json(['status' => 'success', 'message' => 'Genetic Disease updated successfully']);
        } else {
            $alreadyExists = GeneticDisease::where('name', $request->name)->orWhere('name_ar', $request->name_ar)->first();
            if ($alreadyExists) {
                return response()->json(['status' => 'error', 'message' => 'Genetic Disease already exists'], 422);
            }
            $geneticDisease = GeneticDisease::create([
                'name' => $request->name,
                'name_ar' => $request->name_ar,
                'status' => $request->status,
            ]);

            if ($request->has('variants') && is_array($request->variants)) {
                $ceratedRecords = [];
                foreach ($request->variants as $variant) {
                        GeneticDiseaseVariant::create([
                            'name' => $variant['name'],
                            'name_ar' => $variant['name_ar'],
                            'genetic_disease_id' => $geneticDisease->id,
                        ]);
                }
            }

            return response()->json(['status' => 'success', 'message' => 'Genetic Disease added successfully', 'geneticDisease' => $geneticDisease]);
        }
    }

    public function edit($id)
    {
        $geneticDisease = GeneticDisease::findOrFail($id);

        return view('admin.genetic_diseases.create', compact('geneticDisease'));
    }

    public function destroy($id): JsonResponse
    {
        try {
            $geneticDisease = GeneticDisease::findOrFail($id);
            $geneticDisease->delete();
            return response()->json([
                'status' => 'success',
                'message' => 'Genetic Disease deleted successfully.'
            ], 200);
        } catch (ModelNotFoundException $e) {
            return response()->json([
                'status' => 'error',
                'message' => 'Genetic Disease not found.'
            ], 404);
        } catch (Exception $e) {
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while deleting the genetic disease.'
            ], 500);
        }
    }

    public function statusChange(Request $request, $id)
    {
        $geneticDisease = GeneticDisease::find($id);

        if (!$geneticDisease) {
            return response()->json([
                'status' => 'error',
                'message' => 'Genetic Disease not found.'
            ], 404);
        }

        $geneticDisease->status = $request->status;
        $geneticDisease->save();

        return response()->json([
            'status' => 'success',
            'message' => 'Genetic Disease status updated successfully.'
        ]);
    }
}
