<?php

namespace App\Http\Controllers\Controllers;

use Exception;
use App\Models\User;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;

class PerangkatKontroller extends Controller
{
    //show daftar perangkat
    public function index()
    {
        $data = User::orderBy('name', 'asc')->get();
        return view('admin.features.perangkat.perangkat', compact('data'));
    }
    // show form tambah perangkat
    public function create()
    {
        return view('admin.features.perangkat.add-perangkat');
    }

    // show form edit perangkat
    public function edit($id)
    {
        $data = User::findOrFail($id);
        return view('admin.features.perangkat.edit-perangkat', compact('data'));
    }

    // simpan perangkat baru
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'nik'            => 'required|string|unique:users,nik',
            'role'           => ['required', Rule::in(['admin', 'user'])],
            'jabatan'        => 'required|string',
            'name'           => 'required|string|max:255',
            'address'        => 'required|string|max:500',
            'employee_id'    => 'required|string|unique:users,employee_id',
            'phone'          => 'required|string|max:20',
            'jenis_kelamin'  => 'required|in:Laki-laki,Perempuan',
            'tempat_lahir'   => 'required|string|max:255',
            'tanggal_lahir'  => 'required|date_format:d/m/Y',
            'hire_date'      => 'required|date_format:d/m/Y',
            'email'          => 'required|email|unique:users,email',
            'password'       => 'required|string|min:6|confirmed',
            'foto'           => 'nullable|image|max:2048',
        ], [
            'nik.required' => 'NIK wajib diisi.',
            'nik.unique' => 'NIK sudah terdaftar.',
            'role.required' => 'Role wajib dipilih.',
            'role.in' => 'Role yang dipilih tidak valid.',
            'jabatan.required' => 'Jabatan wajib dipilih.',
            'name.required' => 'Nama wajib diisi.',
            'address.required' => 'Alamat wajib diisi.',
            'employee_id.required' => 'ID pegawai wajib diisi.',
            'employee_id.unique' => 'ID pegawai sudah digunakan.',
            'phone.required' => 'No. telepon wajib diisi.',
            'jenis_kelamin.required' => 'Jenis kelamin wajib dipilih.',
            'tempat_lahir.required' => 'Tempat lahir wajib diisi.',
            'tanggal_lahir.required' => 'Tanggal lahir wajib diisi.',
            'tanggal_lahir.date_format' => 'Format tanggal lahir harus dd/mm/yyyy.',
            'hire_date.required' => 'Tanggal diterima kerja wajib diisi.',
            'hire_date.date_format' => 'Format tanggal diterima kerja harus dd/mm/yyyy.',
            'email.required' => 'E-mail wajib diisi.',
            'email.email' => 'Format e-mail tidak valid.',
            'email.unique' => 'E-mail sudah terdaftar.',
            'password.required' => 'Kata sandi wajib diisi.',
            'password.min' => 'Kata sandi minimal 6 karakter.',
            'password.confirmed' => 'Konfirmasi kata sandi tidak cocok.',
            'foto.image' => 'Foto harus berupa file gambar.',
            'foto.max' => 'Ukuran foto maksimal 2MB.',
        ]);

        if ($validator->fails()) {
            return redirect()
                ->back()
                ->withErrors($validator)
                ->withInput();
        }

        try {
            $validated = $validator->validated();

            // 2. Konversi format tanggal ke Y-m-d
            $validated['tanggal_lahir'] = Carbon::createFromFormat('d/m/Y', $validated['tanggal_lahir'])->toDateString();
            $validated['hire_date']     = Carbon::createFromFormat('d/m/Y', $validated['hire_date'])->toDateString();

            // 3. Hash password
            $validated['password'] = Hash::make($validated['password']);

            // 4. Normalisasi payload
            $validated['status'] = 'aktif';
            $validated['alamat'] = $validated['address'];
            $validated['no_telepon'] = $validated['phone'];

            // 5. Upload foto jika ada
            if ($request->hasFile('foto')) {
                $file     = $request->file('foto');
                // buat nama unik agar tidak bentrok
                $filename = Str::slug($validated['name']) . '-' . time() . '.' . $file->getClientOriginalExtension();
                // simpan di storage/app/public/pegawai
                $path     = $file->storeAs('pegawai', $filename, 'public');
                // simpan path relatif ke database
                $validated['url_photo'] = $path; // misal "pegawai/namafile.jpg"
            }

            // 6. Buat user baru
            User::create($validated);

            // 7. Redirect dengan pesan sukses
            return redirect()
                ->route('admin.perangkat')
                ->with('success', 'Anggota perangkat desa berhasil ditambahkan.');
        } catch (Exception $e) {
            Log::error('Error adding perangkat desa: ' . $e->getMessage());
            return redirect()
                ->back()
                ->withInput()
                ->with('error', 'Terjadi kesalahan saat menambahkan anggota perangkat desa.');
        }
    }

    public function update(Request $request, $id)
    {
        $user = User::findOrFail($id);

        $validator = Validator::make($request->all(), [
            'nik'            => ['required', 'min:16', 'string', Rule::unique('users', 'nik')->ignore($user->id)],
            'role'           => ['required', Rule::in(['admin', 'user'])],
            'jabatan'        => 'required|string',
            'name'           => 'required|string|max:255',
            'address'        => 'required|string|max:500',
            'employee_id'    => ['required', 'string', Rule::unique('users', 'employee_id')->ignore($user->id)],
            'phone'          => 'required|string|max:20',
            'jenis_kelamin'  => ['required', Rule::in(['Laki-laki', 'Perempuan'])],
            'tempat_lahir'   => 'required|string|max:255',
            'tanggal_lahir'  => 'required|date_format:d/m/Y',
            'hire_date'      => 'required|date_format:d/m/Y',
            'email'          => ['required', 'email', Rule::unique('users', 'email')->ignore($user->id)],
            'password'       => ['nullable', 'string', 'min:6', 'confirmed'],
            'foto'           => 'nullable|image|max:2048',
        ], [
            'nik.required' => 'NIK wajib diisi.',
            'nik.unique' => 'NIK sudah terdaftar.',
            'nik.min' => 'NIK harus 16 digit',
            'role.required' => 'Role wajib dipilih.',
            'role.in' => 'Role yang dipilih tidak valid.',
            'jabatan.required' => 'Jabatan wajib dipilih.',
            'name.required' => 'Nama wajib diisi.',
            'address.required' => 'Alamat wajib diisi.',
            'employee_id.required' => 'ID pegawai wajib diisi.',
            'employee_id.unique' => 'ID pegawai sudah digunakan.',
            'phone.required' => 'No. telepon wajib diisi.',
            'jenis_kelamin.required' => 'Jenis kelamin wajib dipilih.',
            'tempat_lahir.required' => 'Tempat lahir wajib diisi.',
            'tanggal_lahir.required' => 'Tanggal lahir wajib diisi.',
            'tanggal_lahir.date_format' => 'Format tanggal lahir harus dd/mm/yyyy.',
            'hire_date.required' => 'Tanggal diterima kerja wajib diisi.',
            'hire_date.date_format' => 'Format tanggal diterima kerja harus dd/mm/yyyy.',
            'email.required' => 'E-mail wajib diisi.',
            'email.email' => 'Format e-mail tidak valid.',
            'email.unique' => 'E-mail sudah terdaftar.',
            'password.min' => 'Kata sandi minimal 6 karakter.',
            'password.confirmed' => 'Konfirmasi kata sandi tidak cocok.',
            'foto.image' => 'Foto harus berupa file gambar.',
            'foto.max' => 'Ukuran foto maksimal 2MB.',
        ]);

        if ($validator->fails()) {
            return redirect()
                ->back()
                ->withErrors($validator)
                ->withInput()
            ;
        }

        try {
            $validated = $validator->validated();

            // 2) Siapkan payload update
            $payload = $validated;

            // Konversi tanggal ke Y-m-d
            $payload['tanggal_lahir'] = Carbon::createFromFormat('d/m/Y', $validated['tanggal_lahir'])->toDateString();
            $payload['hire_date']     = Carbon::createFromFormat('d/m/Y', $validated['hire_date'])->toDateString();
            $payload['role']          = $validated['role'];
            $payload['jabatan']       = $validated['jabatan'];
            $payload['alamat']        = $validated['address'];
            $payload['no_telepon']    = $validated['phone'];

            // Password hanya jika diisi
            if (!empty($validated['password'])) {
                $payload['password'] = Hash::make($validated['password']);
            } else {
                unset($payload['password']);
            }

            // Handle foto baru (hapus foto lama bila ada)
            if ($request->hasFile('foto')) {
                $file = $request->file('foto');
                $filename = Str::slug($validated['name'] ?? $user->name) . '-' . time() . '.' . $file->getClientOriginalExtension();
                $path = $file->storeAs('pegawai', $filename, 'public');

                if (!empty($user->url_photo)) {
                    Storage::disk('public')->delete($user->url_photo);
                }
                $payload['url_photo'] = $path;
            }

            // 'foto' bukan kolom tabel
            unset($payload['foto']);

            // 3) Update
            $user->update($payload);

            // 4) Redirect
            return redirect()
                ->route('admin.perangkat')
                ->with('success', 'Data anggota perangkat desa berhasil diperbarui.');
        } catch (Exception $e) {
            Log::error('Error updating perangkat desa: ' . $e->getMessage());
            return redirect()
                ->back()
                ->withInput()
                ->with('error', 'Terjadi kesalahan saat memperbarui anggota perangkat desa.');
        }
    }
}
