<?php

declare(strict_types=1);

namespace App\Http\Controllers\Api\Pwa;

use App\Http\Controllers\Api\Pwa\Traits\RoleAwareQueries;
use App\Http\Controllers\Controller;
use App\Models\CompanyFinancialSettings;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

/**
 * PWA Settings Controller.
 *
 * Returns company configuration for the PWA, including simplified input settings.
 */
class SettingsController extends Controller
{
    use RoleAwareQueries;

    /**
     * GET /api/pwa/settings
     *
     * Returns company settings for PWA forms.
     */
    public function index(Request $request): JsonResponse
    {
        $user = $request->user();
        $settings = CompanyFinancialSettings::forCompany($user->company_id);

        return response()->json($this->buildSettingsPayload($request->user(), $settings));
    }

    /**
     * Construye el payload de settings para las respuestas JSON.
     */
    private function buildSettingsPayload(User $user, CompanyFinancialSettings $settings): array
    {
        return [
            'brand' => [
                'primary_color' => $user->company?->primary_color ?? '#0d9488',
            ],
            'simplified_input' => [
                'enabled' => $settings->isSimplifiedInputEnabled(),
                'credit_enabled' => $settings->isSimplifiedInputEnabled(),
                'payment_enabled' => $settings->isSimplifiedInputEnabled(),
                'multiplier' => $settings->simplified_input_multiplier ?? 1000,
                'require_confirm' => $settings->simplified_input_require_confirm ?? false,
            ],
            'credit_config' => [
                'min_amount' => (float) ($settings->min_credit_amount ?? 1000),
                'max_amount' => (float) ($settings->max_credit_amount ?? 999999999),
                'default_amount' => (float) ($settings->default_credit_amount ?? 100000),
                'min_interest_rate' => (float) ($settings->min_interest_rate ?? 0),
                'max_interest_rate' => (float) ($settings->max_interest_rate ?? 100),
                'default_interest_rate' => (float) ($settings->default_interest_rate ?? 10),
                'min_installments' => (int) ($settings->min_installments ?? 1),
                'max_installments' => (int) ($settings->max_installments ?? 365),
                'default_installments' => (int) ($settings->default_installments ?? 12),
                'allowed_periodicities' => $settings->allowed_periodicities ?? ['daily', 'weekly', 'biweekly', 'monthly'],
                'default_periodicity' => $settings->default_periodicity ?? 'weekly',
            ],
            'payment_config' => [
                'allow_partial' => $settings->allow_partial_payments ?? true,
                'allow_overpayments' => $settings->allow_overpayments ?? true,
                'default_grace_days' => (int) ($settings->default_grace_days ?? 0),
                'days_until_delayed' => (int) ($settings->days_until_delayed ?? 1),
                'days_until_default' => (int) ($settings->days_until_default ?? 90),
                'auto_close_on_paid' => $settings->auto_close_on_full_payment ?? true,
            ],
            'late_fee' => [
                'type' => ($settings->late_fee_percentage > 0) ? 'percentage' : 'fixed',
                'amount' => ($settings->late_fee_percentage > 0)
                    ? (float) $settings->late_fee_percentage
                    : (float) ($settings->late_fee_fixed ?? 0),
            ],
            'currency' => [
                'code' => $settings->currency_code ?? 'COP',
                // Intl (la PWA) exige 'es-CO'; el formato PHP 'es_CO' lanza RangeError.
                'locale' => str_replace('_', '-', (string) ($user->company?->locale ?? 'es-CO')),
            ],
            'ui_preferences' => [
                'show_client_balance_on_payment' => (bool) ($settings->show_client_balance_on_payment ?? true),
                'show_installment_breakdown' => (bool) ($settings->show_installment_breakdown ?? true),
                'require_payment_notes' => (bool) ($settings->require_payment_notes ?? false),
            ],
        ];
    }

    /**
     * PUT /api/pwa/settings
     *
     * Actualiza la configuración de la empresa desde la PWA.
     * Exclusivo para el rol admin.
     */
    public function update(Request $request): JsonResponse
    {
        if ($this->getUserPwaRole($request) !== 'admin') {
            return response()->json(['message' => 'No autorizado. Solo el admin puede modificar la configuración.'], 403);
        }

        $validated = $request->validate([
            'primary_color' => ['sometimes', 'string', 'regex:/^#[0-9a-fA-F]{3,6}$/'],
            'default_interest_rate' => 'sometimes|numeric|min:0|max:100',
            'default_periodicity' => 'sometimes|string|in:daily,weekly,biweekly,monthly',
            'default_grace_days' => 'sometimes|integer|min:0|max:365',
            'late_fee_type' => 'sometimes|string|in:percentage,fixed',
            'late_fee_amount' => 'sometimes|numeric|min:0',
            'simplified_input_enabled' => 'sometimes|boolean',
            'simplified_input_multiplier' => 'sometimes|integer|min:10|max:1000000',
            'simplified_input_require_confirm' => 'sometimes|boolean',
        ]);

        $user = $request->user();

        // ── Actualizar color de marca en Company ──────────────────────────
        if (isset($validated['primary_color'])) {
            $user->company->update(['primary_color' => $validated['primary_color']]);
        }

        // ── Actualizar CompanyFinancialSettings ───────────────────────────
        $settings = CompanyFinancialSettings::forCompany($user->company_id);
        $settingsData = [];

        foreach (['default_interest_rate', 'default_periodicity', 'default_grace_days'] as $field) {
            if (isset($validated[$field])) {
                $settingsData[$field] = $validated[$field];
            }
        }

        if (isset($validated['late_fee_type']) && isset($validated['late_fee_amount'])) {
            if ($validated['late_fee_type'] === 'percentage') {
                $settingsData['late_fee_percentage'] = $validated['late_fee_amount'];
                $settingsData['late_fee_fixed'] = 0;
            } else {
                $settingsData['late_fee_fixed'] = $validated['late_fee_amount'];
                $settingsData['late_fee_percentage'] = 0;
            }
        }

        if (isset($validated['simplified_input_enabled'])) {
            $settingsData['simplified_input_enabled'] = $validated['simplified_input_enabled'];
        }
        if (isset($validated['simplified_input_multiplier'])) {
            $settingsData['simplified_input_multiplier'] = $validated['simplified_input_multiplier'];
        }
        if (isset($validated['simplified_input_require_confirm'])) {
            $settingsData['simplified_input_require_confirm'] = $validated['simplified_input_require_confirm'];
        }

        if (! empty($settingsData)) {
            $settingsData['updated_by_user_id'] = $user->id;
            $settings->update($settingsData);
        }

        $settings->refresh();
        $user->company->refresh();

        return response()->json([
            'message' => 'Configuración actualizada correctamente.',
            'settings' => $this->buildSettingsPayload($user, $settings),
        ]);
    }

    /**
     * GET /api/pwa/settings/simplified-input
     *
     * Returns only simplified input settings (lighter response).
     */
    public function simplifiedInput(Request $request): JsonResponse
    {
        $user = $request->user();
        $settings = CompanyFinancialSettings::forCompany($user->company_id);

        $creditEnabled = $settings->isSimplifiedInputEnabled();
        $paymentEnabled = $settings->isSimplifiedInputEnabled();

        return response()->json([
            'enabled' => $creditEnabled || $paymentEnabled,
            'contexts' => [
                'pwa_credit_create' => $creditEnabled,
                'pwa_payment_create' => $paymentEnabled,
            ],
            'multiplier' => $settings->simplified_input_multiplier ?? 1000,
            'require_confirm' => $settings->simplified_input_require_confirm ?? false,
        ]);
    }

    /**
     * Helper: Convert simplified input to real value.
     */
    public function convertAmount(Request $request): JsonResponse
    {
        $request->validate([
            'amount' => 'required|numeric',
            'context' => 'required|string|in:pwa_credit_create,pwa_payment_create',
        ]);

        $user = $request->user();
        $settings = CompanyFinancialSettings::forCompany($user->company_id);

        $inputAmount = (float) $request->amount;

        if ($settings->isSimplifiedInputEnabled($request->context)) {
            $realAmount = $settings->convertSimplifiedToReal($inputAmount);
        } else {
            $realAmount = $inputAmount;
        }

        return response()->json([
            'input_amount' => $inputAmount,
            'real_amount' => $realAmount,
            'is_simplified' => $settings->isSimplifiedInputEnabled($request->context),
            'multiplier' => $settings->simplified_input_multiplier ?? 1000,
        ]);
    }
}
