<?php

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

/**
 * FIX DE ESQUEMA — tablas y columnas que el código usa pero que NO existen
 * ni en las migraciones ni en database/hoja_tiempo_fedef.sql:
 *
 *  1. empleado_centro_costo  → usada por Empleado::centrosCosto() y
 *     HojaTiempoService::construirGrilla(). Sin ella, abrir una hoja de
 *     tiempo lanza "Base table or view not found".
 *  2. Columnas de empleados: arl_porcentaje, aux_transporte, tipo_contrato,
 *     fecha_ingreso → están en $fillable, en los accessors de costo y en el
 *     formulario, pero no en la tabla.
 *  3. configuraciones → Empleado::getConfig() lee Configuracion::pluck(...).
 *  4. incapacidades → modelo y módulo completo sin tabla.
 *  5. users.rol → el ENUM del dump no incluye 'sst' aunque la app lo valida
 *     y lo usa (puedeVerReportes, IncapacidadController).
 *
 * Ejecutar: php artisan migrate
 */
return new class extends Migration
{
    public function up(): void
    {
        // 1. Pivote empleado ↔ centro de costo
        if (!Schema::hasTable('empleado_centro_costo')) {
            Schema::create('empleado_centro_costo', function (Blueprint $table) {
                $table->id();
                $table->foreignId('empleado_id')->constrained('empleados')->onDelete('cascade');
                $table->foreignId('centro_costo_id')->constrained('centros_costo')->onDelete('cascade');
                $table->timestamps();
                $table->unique(['empleado_id', 'centro_costo_id'], 'uk_emp_cc');
            });
        }

        // 2. Columnas faltantes en empleados
        Schema::table('empleados', function (Blueprint $table) {
            if (!Schema::hasColumn('empleados', 'arl_porcentaje')) {
                $table->decimal('arl_porcentaje', 7, 4)->default(0.5220)->after('zafiro')
                    ->comment('% ARL según riesgo (I=0.522)');
            }
            if (!Schema::hasColumn('empleados', 'aux_transporte')) {
                $table->boolean('aux_transporte')->default(false)->after('arl_porcentaje');
            }
            if (!Schema::hasColumn('empleados', 'tipo_contrato')) {
                $table->string('tipo_contrato', 20)->default('indefinido')->after('cargo');
            }
            if (!Schema::hasColumn('empleados', 'fecha_ingreso')) {
                $table->date('fecha_ingreso')->nullable()->after('tipo_contrato');
            }
        });

        // 3. Configuracion (clave/valor) usada por los cálculos de costo
        //    OJO: el modelo Configuracion define $table = 'configuracion' (SINGULAR)
        if (!Schema::hasTable('configuracion')) {
            Schema::create('configuracion', function (Blueprint $table) {
                $table->id();
                $table->string('clave', 50)->unique();
                $table->string('valor', 100);
                $table->string('descripcion', 200)->nullable();
                $table->timestamps();
            });

            DB::table('configuracion')->insert([
                ['clave' => 'salud_empleador',     'valor' => '8.5',    'descripcion' => '% salud empleador'],
                ['clave' => 'pension_empleador',   'valor' => '12',     'descripcion' => '% pensión empleador'],
                ['clave' => 'caja_compensacion',   'valor' => '4',      'descripcion' => '% caja de compensación'],
                ['clave' => 'sena',                'valor' => '2',      'descripcion' => '% SENA'],
                ['clave' => 'icbf',                'valor' => '3',      'descripcion' => '% ICBF'],
                ['clave' => 'prima',               'valor' => '8.33',   'descripcion' => '% prima'],
                ['clave' => 'cesantias',           'valor' => '8.33',   'descripcion' => '% cesantías'],
                ['clave' => 'int_cesantias',       'valor' => '1',      'descripcion' => '% intereses cesantías'],
                ['clave' => 'vacaciones',          'valor' => '4.17',   'descripcion' => '% vacaciones'],
                ['clave' => 'aux_transporte_2026', 'valor' => '202100', 'descripcion' => 'Auxilio transporte 2026'],
                ['clave' => 'horas_mes',           'valor' => '190',    'descripcion' => 'Horas base por mes para valor hora'],
            ]);
            // NOTA: ajusta los valores a los oficiales de tu empresa/año.
        }

        // 4. Incapacidades (estructura derivada del modelo Incapacidad)
        if (!Schema::hasTable('incapacidades')) {
            Schema::create('incapacidades', function (Blueprint $table) {
                $table->id();
                $table->foreignId('empleado_id')->constrained('empleados')->onDelete('restrict');
                $table->date('fecha_inicio');
                $table->date('fecha_fin');
                $table->unsignedSmallInteger('dias')->default(0);
                $table->string('tipo', 40); // enfermedad_general, accidente_trabajo, etc.
                $table->string('diagnostico', 200)->nullable();
                $table->string('numero_radicado', 50)->nullable();
                $table->text('observaciones')->nullable();
                $table->unsignedSmallInteger('dias_empleador')->default(0);
                $table->decimal('valor_empleador', 12, 2)->default(0);
                $table->unsignedSmallInteger('dias_eps')->default(0);
                $table->decimal('valor_eps', 12, 2)->default(0);
                $table->unsignedSmallInteger('dias_eps2')->default(0);
                $table->decimal('valor_eps2', 12, 2)->default(0);
                $table->unsignedSmallInteger('dias_arl')->default(0);
                $table->decimal('valor_arl', 12, 2)->default(0);
                $table->decimal('total_pagado', 12, 2)->default(0);
                $table->foreignId('creado_por')->nullable()->constrained('users')->onDelete('set null');
                $table->timestamps();
                $table->index(['empleado_id', 'fecha_inicio']);
            });
        }

        // 5. Incluir 'sst' en el ENUM de roles (MySQL)
        DB::statement("ALTER TABLE users MODIFY rol ENUM('admin','supervisor','sst','empleado') DEFAULT 'empleado'");
    }

    public function down(): void
    {
        Schema::dropIfExists('empleado_centro_costo');
        Schema::dropIfExists('incapacidades');
        Schema::dropIfExists('configuracion');
        Schema::table('empleados', function (Blueprint $table) {
            $table->dropColumn(['arl_porcentaje', 'aux_transporte', 'tipo_contrato', 'fecha_ingreso']);
        });
        DB::statement("ALTER TABLE users MODIFY rol ENUM('admin','supervisor','empleado') DEFAULT 'empleado'");
    }
};
