<?php

namespace App\Models\Agency;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Permission\Traits\HasRoles;

class AgencyStaff extends Model
{
    use HasFactory, SoftDeletes, HasRoles;

    protected $table = 'agency_staff';

    protected $fillable = [
        'agency_id',
        'user_id',
        'first_name',
        'last_name',
        'email',
        'phone',

        // Kimlik / kişisel
        'national_id',
        'birth_date',
        'birth_place',
        'gender',
        'marital_status',
        'children_count',
        'blood_type',
        'nationality',

        // Kişisel iletişim / adres
        'phone_alt',
        'personal_email',
        'address',
        'city',
        'district',
        'postal_code',

        // Acil durumda aranacak kişi
        'emergency_contact_name',
        'emergency_contact_phone',
        'emergency_contact_relation',

        // İstihdam
        'position',
        'employee_no',
        'department',
        'employment_type',
        'work_mode',
        'manager_id',
        'hired_at',
        'probation_end_at',
        'contract_end_at',
        'left_at',
        'termination_reason',
        'annual_leave_days',

        // Mali / resmî
        'salary',
        'salary_currency',
        'iban',
        'bank_name',
        'sgk_no',
        'tax_office',

        // Eğitim / askerlik / ehliyet
        'education_level',
        'education_school',
        'education_field',
        'military_status',
        'driving_license',
        'languages',

        // Sağlık notu + dahili yorum
        'health_notes',
        'notes',

        // Durum
        'is_active',
        'is_agency_owner',
        'can_login',
        'resume',
        'experience',
        'created_by',
        'updated_by',
    ];

    protected $casts = [
        'hired_at' => 'date',
        'left_at' => 'date',
        'birth_date' => 'date',
        'probation_end_at' => 'date',
        'contract_end_at' => 'date',
        'children_count' => 'integer',
        'annual_leave_days' => 'integer',
        'salary' => 'decimal:2',
        'is_active' => 'boolean',
        'is_agency_owner' => 'boolean',
        'can_login' => 'boolean',
        'resume' => 'array',
        'experience' => 'array',
    ];

    // ================= Seçim listeleri =================

    /** Cinsiyet seçenekleri. */
    public static function genders(): array
    {
        return [
            'male' => 'Erkek',
            'female' => 'Kadın',
            'other' => 'Diğer',
        ];
    }

    /** Medeni durum seçenekleri. */
    public static function maritalStatuses(): array
    {
        return [
            'single' => 'Bekâr',
            'married' => 'Evli',
            'divorced' => 'Boşanmış',
            'widowed' => 'Dul',
        ];
    }

    /** Kan grubu seçenekleri (0 Rh+ yerine yaygın gösterim). */
    public static function bloodTypes(): array
    {
        return [
            'A+' => 'A Rh+', 'A-' => 'A Rh−',
            'B+' => 'B Rh+', 'B-' => 'B Rh−',
            'AB+' => 'AB Rh+', 'AB-' => 'AB Rh−',
            '0+' => '0 Rh+', '0-' => '0 Rh−',
        ];
    }

    /** Çalışma şekli. */
    public static function employmentTypes(): array
    {
        return [
            'full_time' => 'Tam Zamanlı',
            'part_time' => 'Yarı Zamanlı',
            'contract' => 'Sözleşmeli',
            'intern' => 'Stajyer',
            'seasonal' => 'Sezonluk',
            'freelance' => 'Serbest / Dış Kaynak',
        ];
    }

    /** Çalışma düzeni. */
    public static function workModes(): array
    {
        return [
            'office' => 'Ofisten',
            'remote' => 'Uzaktan',
            'hybrid' => 'Hibrit',
        ];
    }

    /** Eğitim durumu. */
    public static function educationLevels(): array
    {
        return [
            'primary' => 'İlkokul',
            'secondary' => 'Ortaokul',
            'high_school' => 'Lise',
            'associate' => 'Ön Lisans',
            'bachelor' => 'Lisans',
            'master' => 'Yüksek Lisans',
            'doctorate' => 'Doktora',
        ];
    }

    /** Askerlik durumu. */
    public static function militaryStatuses(): array
    {
        return [
            'done' => 'Yapıldı',
            'exempt' => 'Muaf',
            'postponed' => 'Tecilli',
            'not_required' => 'Yükümlü Değil',
        ];
    }

    // ================= İlişkiler =================

    /**
     * Get the agency this staff member belongs to.
     */
    public function agency(): BelongsTo
    {
        return $this->belongsTo(Agency::class);
    }

    /**
     * Get the user account for this staff member (if any).
     */
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    /**
     * Bağlı olduğu yönetici (aynı acentedeki başka bir personel kaydı).
     */
    public function manager(): BelongsTo
    {
        return $this->belongsTo(self::class, 'manager_id');
    }

    /**
     * Bu personele bağlı çalışanlar.
     */
    public function subordinates()
    {
        return $this->hasMany(self::class, 'manager_id');
    }

    // ================= Türetilmiş alanlar =================

    /**
     * Get the full name of the staff member.
     */
    public function getFullNameAttribute(): string
    {
        return "{$this->first_name} {$this->last_name}";
    }

    /**
     * Baş harfler — quick-view yığın tutamağı ve görev çubuğu bunu okur.
     */
    public function getInitialsAttribute(): string
    {
        $first = mb_substr((string) $this->first_name, 0, 1, 'UTF-8');
        $last = mb_substr((string) $this->last_name, 0, 1, 'UTF-8');

        return mb_strtoupper($first . $last, 'UTF-8');
    }

    /**
     * Kart üstündeki durum rozeti: ayrıldıysa "Ayrıldı", aktif değilse "Pasif".
     */
    public function getStatusLabelAttribute(): string
    {
        if ($this->left_at) {
            return 'Ayrıldı';
        }

        return $this->is_active ? 'Aktif' : 'Pasif';
    }

    /** Rozetin renk sınıfı (.sb active | inactive | blocked). */
    public function getStatusClassAttribute(): string
    {
        if ($this->left_at) {
            return 'blocked';
        }

        return $this->is_active ? 'active' : 'inactive';
    }

    public function getGenderLabelAttribute(): string
    {
        return self::genders()[$this->gender] ?? '';
    }

    public function getMaritalStatusLabelAttribute(): string
    {
        return self::maritalStatuses()[$this->marital_status] ?? '';
    }

    public function getEmploymentTypeLabelAttribute(): string
    {
        return self::employmentTypes()[$this->employment_type] ?? '';
    }

    public function getWorkModeLabelAttribute(): string
    {
        return self::workModes()[$this->work_mode] ?? '';
    }

    public function getEducationLevelLabelAttribute(): string
    {
        return self::educationLevels()[$this->education_level] ?? '';
    }

    public function getMilitaryStatusLabelAttribute(): string
    {
        return self::militaryStatuses()[$this->military_status] ?? '';
    }

    /**
     * Kıdem — işe giriş ile ayrılış (yoksa bugün) arasındaki süre, "3 yıl 2 ay".
     */
    public function getTenureLabelAttribute(): string
    {
        if (! $this->hired_at) {
            return '';
        }

        $end = $this->left_at ?: now();
        $diff = $this->hired_at->diff($end);

        $parts = [];
        if ($diff->y) {
            $parts[] = $diff->y . ' yıl';
        }
        if ($diff->m) {
            $parts[] = $diff->m . ' ay';
        }
        if (! $parts) {
            $parts[] = max($diff->days, 0) . ' gün';
        }

        return implode(' ', $parts);
    }

    // ================= Scope'lar =================

    public function scopeByAgency($query, ?int $agencyId)
    {
        return $query->where('agency_staff.agency_id', $agencyId);
    }

    public function scopeActive($query)
    {
        return $query->where('agency_staff.is_active', true);
    }

    /**
     * Boot the model.
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($staff) {
            if (auth()->check()) {
                $staff->created_by = auth()->id();
            }
        });

        static::updating(function ($staff) {
            if (auth()->check()) {
                $staff->updated_by = auth()->id();
            }
        });
    }
}
