<?php

namespace App\Models;

use App\Models\Concerns\BelongsToCompany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class AttendancePunch extends Model
{
    use BelongsToCompany;

    public const STATUS_PENDING = 'pending';

    public const STATUS_APPLIED = 'applied';

    public const STATUS_IGNORED = 'ignored';

    public const STATUS_ERROR = 'error';

    public const TYPE_FIRST_IN = 'FIRST_IN';

    public const TYPE_INTERMEDIATE = 'INTERMEDIATE';

    public const TYPE_LAST_OUT = 'LAST_OUT';

    public const TYPE_DUPLICATE = 'DUPLICATE';

    public const SOURCE_BIOMETRIC_DEVICE = 'BIOMETRIC_DEVICE';

    public const SOURCE_MOBILE_FACE = 'MOBILE_FACE';

    public const SOURCE_WEB = 'WEB';

    public const SOURCE_MANUAL = 'MANUAL';

    protected $table = 'attendance_punches';

    protected $fillable = [
        'company_id',
        'biometric_device_id',
        'emp_code',
        'user_id',
        'punch_datetime',
        'punch_date',
        'attendance_date',
        'punch_time',
        'punch_state',
        'verify_type',
        'terminal_sn',
        'terminal_alias',
        'longitude',
        'latitude',
        'gps_location',
        'temperature',
        'mask_flag',
        'upload_time',
        'raw_payload',
        'status',
        'processed_type',
        'is_duplicate',
        'source',
        'device_transaction_id',
        'error_message',
        'attendance_id',
        'work_duration_id',
        'processed_at',
    ];

    protected $casts = [
        'punch_datetime' => 'datetime',
        'punch_date' => 'date',
        'attendance_date' => 'date',
        'raw_payload' => 'array',
        'processed_at' => 'datetime',
        'is_duplicate' => 'boolean',
    ];

    public function device(): BelongsTo
    {
        return $this->belongsTo(BiometricDevice::class, 'biometric_device_id');
    }

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function attendance(): BelongsTo
    {
        return $this->belongsTo(Attendance::class);
    }

    public function workDuration(): BelongsTo
    {
        return $this->belongsTo(WorkDuration::class);
    }

    public function isRetryable(): bool
    {
        return in_array($this->status, [self::STATUS_PENDING, self::STATUS_ERROR], true);
    }
}
