<?php

namespace App\Services\Attendance;

use App\Models\Location;

class AttendancePunchDecision
{
    public function __construct(
        public readonly string $attendanceType,
        public readonly string $method,
        public readonly ?float $latitude,
        public readonly ?float $longitude,
        public readonly ?float $accuracy,
        public readonly ?string $locationLabel,
        public readonly ?int $locationId,
        public readonly ?int $distanceMeters,
        public readonly ?string $officeName,
        public readonly ?string $remoteReason,
        public readonly ?string $remoteApprovalStatus,
    ) {}

    /**
     * @return array<string, mixed>
     */
    public function clockInAttributes(): array
    {
        return [
            'attendance_type' => $this->attendanceType,
            'clock_in_method' => $this->method,
            'clock_in_latitude' => $this->latitude,
            'clock_in_longitude' => $this->longitude,
            'clock_in_accuracy' => $this->accuracy,
            'clock_in_distance_meters' => $this->distanceMeters,
            'clock_in_location_id' => $this->locationId,
            'clock_in_location' => $this->locationLabel,
            'remote_reason' => $this->remoteReason,
            'remote_approval_status' => $this->remoteApprovalStatus,
        ];
    }

    /**
     * @return array<string, mixed>
     */
    public function clockOutAttributes(): array
    {
        return [
            'clock_out_method' => $this->method,
            'clock_out_latitude' => $this->latitude,
            'clock_out_longitude' => $this->longitude,
            'clock_out_accuracy' => $this->accuracy,
            'clock_out_distance_meters' => $this->distanceMeters,
            'clock_out_location_id' => $this->locationId,
            'clock_out_location' => $this->locationLabel,
        ];
    }

    public static function biometric(?Location $location = null): self
    {
        return new self(
            attendanceType: 'office',
            method: 'biometric',
            latitude: null,
            longitude: null,
            accuracy: null,
            locationLabel: $location?->name,
            locationId: $location?->id,
            distanceMeters: null,
            officeName: $location?->name,
            remoteReason: null,
            remoteApprovalStatus: null,
        );
    }
}
