<?php

namespace App\Models;

use App\Models\Concerns\BelongsToCompany;
use Illuminate\Database\Eloquent\Relations\HasMany;

class WeekoffRule extends Model
{
    use BelongsToCompany;

    public const STATUS_ACTIVE = 'active';

    public const STATUS_INACTIVE = 'inactive';

    public const DAY_WORKING = 'working';

    public const DAY_HALF = 'half_day';

    public const DAY_WEEKLY_OFF = 'weekly_off';

    protected $fillable = [
        'company_id',
        'name',
        'description',
        'effective_from',
        'status',
        'half_day_enabled',
        'is_company_default',
        'schedule',
    ];

    protected $casts = [
        'effective_from' => 'date',
        'half_day_enabled' => 'boolean',
        'is_company_default' => 'boolean',
        'schedule' => 'array',
    ];

    public function assignments(): HasMany
    {
        return $this->hasMany(WeekoffRuleAssignment::class, 'weekoff_rule_id');
    }

    public function isActive(): bool
    {
        return $this->status === self::STATUS_ACTIVE;
    }

    /**
     * @return array<string, array<string, string>>
     */
    public static function defaultSchedule(): array
    {
        $weekDays = [
            'mon' => self::DAY_WORKING,
            'tue' => self::DAY_WORKING,
            'wed' => self::DAY_WORKING,
            'thu' => self::DAY_WORKING,
            'fri' => self::DAY_WORKING,
            'sat' => self::DAY_WORKING,
            'sun' => self::DAY_WEEKLY_OFF,
        ];

        $schedule = [];
        for ($week = 1; $week <= 5; $week++) {
            $schedule[(string) $week] = $weekDays;
        }

        return $schedule;
    }

    /**
     * @return list<string>
     */
    public static function dayKeys(): array
    {
        return ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];
    }

    /**
     * @return list<string>
     */
    public static function weekKeys(): array
    {
        return ['1', '2', '3', '4', '5'];
    }
}
