<?php

declare(strict_types=1);

namespace App\Services;

use App\Core\Database;

class SaasAccessService
{
    public function evaluateCompanyAccess(int $companyId, bool $syncStates = true): array
    {
        if ($companyId <= 0) {
            return [
                'allowed' => false,
                'message' => 'No tienes empresa asignada para operar el sistema.',
                'company_status' => null,
                'subscription_status' => null,
                'subscription_id' => null,
            ];
        }

        $pdo = Database::connection();

        $companyStmt = $pdo->prepare(
            'SELECT id, nombre, estado
             FROM empresas
             WHERE id = :empresa_id
             LIMIT 1'
        );
        $companyStmt->execute([':empresa_id' => $companyId]);
        $company = $companyStmt->fetch();

        if (!$company) {
            return [
                'allowed' => false,
                'message' => 'La empresa seleccionada no existe.',
                'company_status' => null,
                'subscription_status' => null,
                'subscription_id' => null,
            ];
        }

        $companyStatus = (string) ($company['estado'] ?? 'activa');
        if ($companyStatus !== 'activa') {
            $message = $companyStatus === 'suspendida'
                ? 'Tu empresa está suspendida temporalmente. Contacta soporte para reactivarla.'
                : 'Tu empresa está bloqueada. Contacta soporte para habilitar el acceso.';

            return [
                'allowed' => false,
                'message' => $message,
                'company_status' => $companyStatus,
                'subscription_status' => null,
                'subscription_id' => null,
            ];
        }

        $subscriptionStmt = $pdo->prepare(
            'SELECT id, estado, fecha_inicio, fecha_vencimiento, trial
             FROM suscripciones
             WHERE empresa_id = :empresa_id
             ORDER BY fecha_vencimiento DESC, id DESC
             LIMIT 1'
        );
        $subscriptionStmt->execute([':empresa_id' => $companyId]);
        $subscription = $subscriptionStmt->fetch();

        if (!$subscription) {
            return [
                'allowed' => false,
                'message' => 'La empresa no tiene suscripción activa. Contacta soporte comercial.',
                'company_status' => $companyStatus,
                'subscription_status' => null,
                'subscription_id' => null,
            ];
        }

        $subscriptionId = (int) ($subscription['id'] ?? 0);
        $subscriptionStatus = (string) ($subscription['estado'] ?? 'activa');
        $dueDate = (string) ($subscription['fecha_vencimiento'] ?? '');
        $today = date('Y-m-d');
        $moraDays = max(0, (int) config('saas.mora_days', 3));

        if ($syncStates) {
            if ($subscriptionStatus === 'activa' && $dueDate !== '' && $dueDate < $today) {
                $updateExpired = $pdo->prepare(
                    'UPDATE suscripciones
                     SET estado = "vencida",
                         updated_at = NOW()
                     WHERE id = :id
                       AND estado = "activa"'
                );
                $updateExpired->execute([':id' => $subscriptionId]);
                $subscriptionStatus = 'vencida';
            }

            if (
                $subscriptionStatus === 'vencida'
                && $dueDate !== ''
                && strtotime($dueDate . ' +' . $moraDays . ' days') < strtotime($today)
            ) {
                $updateMorosa = $pdo->prepare(
                    'UPDATE suscripciones
                     SET estado = "morosa",
                         updated_at = NOW()
                     WHERE id = :id
                       AND estado = "vencida"'
                );
                $updateMorosa->execute([':id' => $subscriptionId]);
                $subscriptionStatus = 'morosa';
            }
        }

        if ($subscriptionStatus === 'activa') {
            return [
                'allowed' => true,
                'message' => '',
                'company_status' => $companyStatus,
                'subscription_status' => $subscriptionStatus,
                'subscription_id' => $subscriptionId,
            ];
        }

        $message = match ($subscriptionStatus) {
            'vencida' => 'La suscripción de la empresa está vencida. Renueva para continuar.',
            'morosa' => 'La suscripción está en mora. Regulariza el pago para habilitar el acceso.',
            'cancelada' => 'La suscripción de la empresa está cancelada.',
            default => 'La suscripción actual no permite acceso al sistema.',
        };

        return [
            'allowed' => false,
            'message' => $message,
            'company_status' => $companyStatus,
            'subscription_status' => $subscriptionStatus,
            'subscription_id' => $subscriptionId,
        ];
    }
}
