<?php

    namespace Modules\Lpj\Http\Requests;

    use Illuminate\Foundation\Http\FormRequest;

    /**
     * Form Request untuk validasi data NOC (Notice of Completion)
     */
    class NocRequest extends FormRequest
    {
        /**
         * Konstanta untuk jenis file yang diizinkan
         */
        private const ALLOWED_FILE_TYPES = 'pdf,jpg,jpeg,png';

        /**
         * Konstanta untuk ukuran file maksimum (dalam KB)
         */
        private const MAX_FILE_SIZE = 10240;

        /**
         * Menentukan apakah pengguna berwenang untuk melakukan request ini
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }

        /**
         * Mengumpulkan semua aturan validasi
         *
         * @return array
         */
        public function rules()
        {
            return array_merge(
                $this->getBasicInfoRules(),
                $this->getPaymentRules(),
                $this->getSettlementRules(),
                $this->getAuthorizationRules(),
            );
        }

        /**
         * Aturan validasi untuk informasi dasar
         *
         * @return array
         */
        private function getBasicInfoRules()
        {
            return [
                'permohonan_id'            => 'nullable|exists:permohonan,id',
                'persetujuan_penawaran_id' => 'required|exists:persetujuan_penawaran,id',
                'status'                   => 'nullable|boolean',
                'created_by'               => 'nullable|exists:users,id',
                'updated_by'               => 'nullable|exists:users,id',
            ];
        }

        /**
         * Aturan validasi untuk data pembayaran
         *
         * @return array
         */
        private function getPaymentRules()
        {
            $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE;

            return [
                'total_harus_bayar'  => 'nullable|numeric|min:0',
                'nominal_bayar'      => 'nullable|numeric|min:0',
                'total_pembukuan'    => 'nullable|numeric|min:0',
                'bukti_ksl'          => $fileRule,
                'bukti_bayar'        => $fileRule,
                'status_bayar'       => 'nullable|boolean',
                'tanggal_pembayaran' => 'nullable|date',
                'status_kurang_bayar' => 'nullable|boolean',
                'status_lebih_bayar' => 'nullable|boolean',
                'nominal_kurang_bayar' => 'nullable|numeric|min:0',
                'nominal_lebih_bayar' => 'nullable|numeric|min:0',
                'bukti_pengembalian' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:2048',
            ];
        }

        /**
         * Aturan validasi untuk data penyelesaian
         *
         * @return array
         */
        private function getSettlementRules()
        {
            $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE;

            return [
                'nominal_penyelesaian'       => 'nullable|numeric|min:0',
                'status_penyelesaian'        => 'nullable|boolean',
                'tanggal_penyelesaian'       => 'nullable|date',
                'bukti_penyelesaian'         => $fileRule,
                'memo_penyelesaian'          => $fileRule,
                'catatan_noc'                => 'nullable|string',
                'nomor_tiket'                => 'nullable|string',
                'nomor_rekening_lebih_bayar' => 'nullable|string',
                'bukti_ksl_lebih_bayar'      => 'nullable|string',
                'bukti_ksl_kurang_bayar'     => 'nullable|string'
            ];
        }

        /**
         * Aturan validasi untuk otorisasi
         *
         * @return array
         */
        private function getAuthorizationRules()
        {
            return [
                'authorized_status' => 'nullable|boolean',
                'authorized_at'     => 'nullable|date',
                'authorized_by'     => 'nullable|exists:users,id',
            ];
        }

        /**
         * Pesan khusus untuk validasi
         *
         * @return array
         */
        public function messages()
        {
            return [
                'permohonan_id.exists'              => 'ID Permohonan tidak valid',
                'persetujuan_penawaran_id.required' => 'ID Persetujuan Penawaran harus diisi',
                'persetujuan_penawaran_id.exists'   => 'ID Persetujuan Penawaran tidak valid',
                'nominal_bayar.numeric'             => 'Nominal Bayar harus berupa angka',
                'nominal_bayar.min'                 => 'Nominal Bayar minimal 0',
                'bukti_ksl.file'                    => 'Bukti KSL harus berupa file',
                'bukti_ksl.mimes'                   => 'Bukti KSL harus berformat pdf, jpg, jpeg, atau png',
                'bukti_ksl.max'                     => 'Ukuran Bukti KSL maksimal 10MB',
                'bukti_bayar.file'                  => 'Bukti Bayar harus berupa file',
                'bukti_bayar.mimes'                 => 'Bukti Bayar harus berformat pdf, jpg, jpeg, atau png',
                'bukti_bayar.max'                   => 'Ukuran Bukti Bayar maksimal 10MB',
                'status.boolean'                    => 'Status harus berupa boolean',
                'status_bayar.boolean'              => 'Status Bayar harus berupa boolean',
                'tanggal_pembayaran.date'           => 'Format Tanggal Pembayaran tidak valid',
                'nominal_penyelesaian.numeric'      => 'Nominal Penyelesaian harus berupa angka',
                'nominal_penyelesaian.min'          => 'Nominal Penyelesaian minimal 0',
                'status_penyelesaian.boolean'       => 'Status Penyelesaian harus berupa boolean',
                'tanggal_penyelesaian.date'         => 'Format Tanggal Penyelesaian tidak valid',
                'bukti_penyelesaian.file'           => 'Bukti Penyelesaian harus berupa file',
                'bukti_penyelesaian.mimes'          => 'Bukti Penyelesaian harus berformat pdf, jpg, jpeg, atau png',
                'bukti_penyelesaian.max'            => 'Ukuran Bukti Penyelesaian maksimal 10MB',
                'memo_penyelesaian.file'            => 'Memo Penyelesaian harus berupa file',
                'memo_penyelesaian.mimes'           => 'Memo Penyelesaian harus berformat pdf, jpg, jpeg, atau png',
                'memo_penyelesaian.max'             => 'Ukuran Memo Penyelesaian maksimal 10MB',
                'authorized_status.boolean'         => 'Status Otorisasi harus berupa boolean',
                'authorized_at.date'                => 'Format Tanggal Otorisasi tidak valid',
                'authorized_by.exists'              => 'User Otorisasi tidak valid',
                'status_kurang_bayar.boolean'       => 'Status Kurang Bayar harus berupa boolean',
                'status_lebih_bayar.boolean'        => 'Status Lebih Bayar harus berupa boolean',
                'nominal_kurang_bayar.numeric'      => 'Nominal Kurang Bayar harus berupa angka',
                'nominal_kurang_bayar.min'          => 'Nominal Kurang Bayar minimal 0',
                'nominal_lebih_bayar.numeric'       => 'Nominal Lebih Bayar harus berupa angka',
            ];
        }
    }
