<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreFinancialRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     */
    public function rules(): array
    {
        return [
            'aset_lancar' => [
                'required',
                'numeric',
                'min:0',
                'max:9999999999999.99'
            ],
            'aset_tetap' => [
                'required',
                'numeric',
                'min:0',
                'max:9999999999999.99'
            ],
            'utang_lancar' => [
                'required',
                'numeric',
                'min:0',
                'max:9999999999999.99'
            ],
            'utang_jangka_panjang' => [
                'required',
                'numeric',
                'min:0',
                'max:9999999999999.99'
            ],
            'pendapatan' => [
                'required',
                'numeric',
                'min:0',
                'max:9999999999999.99'
            ],
            'biaya_operasional' => [
                'required',
                'numeric',
                'min:0',
                'max:9999999999999.99'
            ],
            'prive' => [
                'required',
                'numeric',
                'min:0',
                'max:9999999999999.99'
            ],
        ];
    }

    /**
     * Get custom messages for validator errors.
     */
    public function messages(): array
    {
        return [
            'aset_lancar.required' => 'Aset lancar harus diisi.',
            'aset_lancar.numeric' => 'Aset lancar harus berupa angka.',
            'aset_lancar.min' => 'Aset lancar tidak boleh negatif.',
            
            'aset_tetap.required' => 'Aset tetap harus diisi.',
            'aset_tetap.numeric' => 'Aset tetap harus berupa angka.',
            'aset_tetap.min' => 'Aset tetap tidak boleh negatif.',
            
            'utang_lancar.required' => 'Utang lancar harus diisi.',
            'utang_lancar.numeric' => 'Utang lancar harus berupa angka.',
            'utang_lancar.min' => 'Utang lancar tidak boleh negatif.',
            
            'utang_jangka_panjang.required' => 'Utang jangka panjang harus diisi.',
            'utang_jangka_panjang.numeric' => 'Utang jangka panjang harus berupa angka.',
            'utang_jangka_panjang.min' => 'Utang jangka panjang tidak boleh negatif.',
            
            'pendapatan.required' => 'Pendapatan harus diisi.',
            'pendapatan.numeric' => 'Pendapatan harus berupa angka.',
            'pendapatan.min' => 'Pendapatan tidak boleh negatif.',
            
            'biaya_operasional.required' => 'Biaya operasional harus diisi.',
            'biaya_operasional.numeric' => 'Biaya operasional harus berupa angka.',
            'biaya_operasional.min' => 'Biaya operasional tidak boleh negatif.',
            
            'prive.required' => 'Prive harus diisi.',
            'prive.numeric' => 'Prive harus berupa angka.',
            'prive.min' => 'Prive tidak boleh negatif.',
        ];
    }

    /**
     * Prepare the data for validation.
     */
    protected function prepareForValidation(): void
    {
        // Remove thousand separators and convert to proper number format
        $this->merge([
            'aset_lancar' => $this->cleanNumber($this->aset_lancar),
            'aset_tetap' => $this->cleanNumber($this->aset_tetap),
            'utang_lancar' => $this->cleanNumber($this->utang_lancar),
            'utang_jangka_panjang' => $this->cleanNumber($this->utang_jangka_panjang),
            'pendapatan' => $this->cleanNumber($this->pendapatan),
            'biaya_operasional' => $this->cleanNumber($this->biaya_operasional),
            'prive' => $this->cleanNumber($this->prive),
        ]);
    }

    /**
     * Clean number from thousand separators and convert to float
     */
    private function cleanNumber($value)
    {
        if (is_null($value) || $value === '') {
            return $value;
        }
        
        // Remove dots (thousand separators) and replace comma with dot
        $value = str_replace('.', '', $value);
        $value = str_replace(',', '.', $value);
        
        return (float) $value;
    }

    /**
     * Additional validation after main validation
     */
    public function withValidator($validator): void
    {
        $validator->after(function ($validator) {
            $data = $this->all();
            
            // Check if total aset > 0 (for Z-Score calculation)
            $totalAset = ($data['aset_lancar'] ?? 0) + ($data['aset_tetap'] ?? 0);
            if ($totalAset <= 0) {
                $validator->errors()->add('aset_lancar', 'Total aset harus lebih dari 0 untuk perhitungan Z-Score.');
            }
            
            // Check if biaya operasional > pendapatan (warning only, not error)
            if (($data['biaya_operasional'] ?? 0) > ($data['pendapatan'] ?? 0)) {
                session()->flash('warning', 'Biaya operasional lebih besar dari pendapatan. Perusahaan mengalami kerugian operasional.');
            }
            
            // Check if total utang > total aset (warning only)
            $totalUtang = ($data['utang_lancar'] ?? 0) + ($data['utang_jangka_panjang'] ?? 0);
            if ($totalUtang > $totalAset) {
                session()->flash('warning', 'Total utang melebihi total aset. Perusahaan memiliki ekuitas negatif.');
            }
        });
    }
}