<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('financial_operations', function (Blueprint $table) {
            $table->id();

            // Multi-tenant
            $table->foreignId('company_id')
                ->constrained()
                ->cascadeOnDelete();

            // Actor que ejecuta la operación
            $table->foreignId('user_id')
                ->constrained()
                ->cascadeOnDelete();

            /**
             * Tipo de operación financiera
             *
             * - credit_disbursement
             * - credit_extension
             * - credit_refinance
             * - credit_restructure
             * - internal_adjustment
             */
            $table->string('operation_type');

            /**
             * Crédito origen (si existe)
             * Ej: crédito viejo en una extensión/refinanciación
             */
            $table->foreignId('source_credit_id')
                ->nullable()
                ->constrained('credits')
                ->nullOnDelete();

            /**
             * Crédito destino (si existe)
             * Ej: crédito nuevo generado
             */
            $table->foreignId('target_credit_id')
                ->nullable()
                ->constrained('credits')
                ->nullOnDelete();

            /**
             * Valores financieros
             */

            // Monto total del nuevo crédito (si aplica)
            $table->decimal('credit_amount', 12, 2)->default(0);

            // Saldo que se compensa del crédito anterior
            $table->decimal('compensated_amount', 12, 2)->default(0);

            // Dinero que realmente sale de caja
            $table->decimal('cash_out', 12, 2)->default(0);

            // Dinero que entra a caja (si aplica)
            $table->decimal('cash_in', 12, 2)->default(0);

            /**
             * Relación opcional con movimientos contables
             */
            $table->foreignId('expense_id')
                ->nullable()
                ->constrained('expenses')
                ->nullOnDelete();

            $table->foreignId('income_id')
                ->nullable()
                ->constrained('incomes')
                ->nullOnDelete();

            /**
             * Metadatos y trazabilidad
             */
            $table->json('metadata')->nullable();
            $table->text('notes')->nullable();

            $table->timestamps();

            // Índices útiles
            $table->index(['company_id', 'operation_type']);
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('financial_operations');
    }
};
