<?php

namespace App\Services\Hr;

use App\Models\Offboarding;
use App\Models\Resignation;
use App\Models\Termination;
use App\Models\User;

class ExitOffboardingBridgeService
{
    public function __construct(
        protected OffboardingWorkflowService $workflow
    ) {}

    public function fromResignation(Resignation $resignation): ?Offboarding
    {
        if ($resignation->status !== 'approved' || $resignation->offboarding_id) {
            return null;
        }

        $user = $resignation->user;
        if (! $user) {
            return null;
        }

        if ($this->hasActiveOffboarding((int) $user->id)) {
            return null;
        }

        $offboarding = Offboarding::create([
            'company_id' => $resignation->company_id ?? $user->company_id,
            'user_id' => $user->id,
            'offboarding_date' => $resignation->resignation_date,
            'last_working_date' => $resignation->last_working_date ?? $resignation->resignation_date,
            'type' => 'resignation',
            'status' => Offboarding::STATUS_IN_PROGRESS,
            'reason' => $resignation->reason,
            'notes' => $resignation->notes,
        ]);

        $this->workflow->initiate($offboarding);
        $resignation->update(['offboarding_id' => $offboarding->id]);

        return $offboarding->fresh();
    }

    public function fromTermination(Termination $termination): ?Offboarding
    {
        if ($termination->status !== 'active' || $termination->offboarding_id) {
            return null;
        }

        $user = $termination->user;
        if (! $user) {
            return null;
        }

        if ($this->hasActiveOffboarding((int) $user->id)) {
            return null;
        }

        $offboarding = Offboarding::create([
            'company_id' => $termination->company_id ?? $user->company_id,
            'user_id' => $user->id,
            'offboarding_date' => $termination->termination_date,
            'last_working_date' => $termination->termination_date,
            'type' => 'termination',
            'status' => Offboarding::STATUS_IN_PROGRESS,
            'reason' => trim(($termination->reason_type ? $termination->reason_type . ': ' : '') . (string) ($termination->reason ?? '')),
            'notes' => $termination->notes,
        ]);

        $this->workflow->initiate($offboarding);
        $termination->update(['offboarding_id' => $offboarding->id]);

        return $offboarding->fresh();
    }

    protected function hasActiveOffboarding(int $userId): bool
    {
        return Offboarding::query()
            ->where('user_id', $userId)
            ->whereNotIn('status', [Offboarding::STATUS_COMPLETED, Offboarding::STATUS_CANCELLED])
            ->exists();
    }
}
