<?php

namespace App\Models;

use App\Models\Concerns\BelongsToCompany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

class IncomeTaxDeclaration extends Model
{
    use BelongsToCompany;

    public const STATUS_DRAFT = 'draft';

    public const STATUS_SUBMITTED = 'submitted';

    public const STATUS_VERIFIED = 'verified';

    public const STATUS_REJECTED = 'rejected';

    protected $fillable = [
        'company_id',
        'user_id',
        'financial_year',
        'regime',
        'income_tax_plan_id',
        'gross_annual_estimate',
        'total_deductions_declared',
        'total_deductions_verified',
        'taxable_income',
        'annual_tax',
        'monthly_tds',
        'status',
        'submitted_at',
        'verified_at',
        'verified_by',
        'hr_remarks',
    ];

    protected $casts = [
        'gross_annual_estimate' => 'decimal:2',
        'total_deductions_declared' => 'decimal:2',
        'total_deductions_verified' => 'decimal:2',
        'taxable_income' => 'decimal:2',
        'annual_tax' => 'decimal:2',
        'monthly_tds' => 'decimal:2',
        'submitted_at' => 'datetime',
        'verified_at' => 'datetime',
    ];

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function plan(): BelongsTo
    {
        return $this->belongsTo(IncomeTaxPlan::class, 'income_tax_plan_id');
    }

    public function verifier(): BelongsTo
    {
        return $this->belongsTo(User::class, 'verified_by');
    }

    public function items(): HasMany
    {
        return $this->hasMany(IncomeTaxDeclarationItem::class);
    }

    public function isEditable(): bool
    {
        return in_array($this->status, [self::STATUS_DRAFT, self::STATUS_REJECTED], true);
    }

    public function allProofsApproved(): bool
    {
        if ($this->items->isEmpty()) {
            return true;
        }

        return $this->items->every(
            fn (IncomeTaxDeclarationItem $item) => $item->proof_status === IncomeTaxDeclarationItem::PROOF_APPROVED
        );
    }

    /**
     * @return \Illuminate\Support\Collection<int, IncomeTaxDeclarationItem>
     */
    public function unapprovedProofItems()
    {
        return $this->items->filter(
            fn (IncomeTaxDeclarationItem $item) => $item->proof_status !== IncomeTaxDeclarationItem::PROOF_APPROVED
        );
    }

    public function canUploadProofs(): bool
    {
        return in_array($this->status, [
            self::STATUS_DRAFT,
            self::STATUS_SUBMITTED,
            self::STATUS_REJECTED,
        ], true);
    }

    /**
     * Single source of truth for employee UI: edit | proof_only | locked.
     */
    public function uiMode(): string
    {
        if ($this->status === self::STATUS_VERIFIED) {
            return 'locked';
        }

        if ($this->status === self::STATUS_SUBMITTED) {
            return 'proof_only';
        }

        return 'edit';
    }

    /**
     * @return array{mode: string, label: string, hint: string, can_edit: bool, can_save: bool, can_submit: bool, can_upload_proofs: bool}
     */
    public function uiState(bool $windowOpen = true): array
    {
        $mode = $this->uiMode();

        return match ($mode) {
            'locked' => [
                'mode' => 'locked',
                'label' => 'Verified',
                'hint' => 'Your declaration is verified. Download Form 16 when available.',
                'can_edit' => false,
                'can_save' => false,
                'can_submit' => false,
                'can_upload_proofs' => false,
            ],
            'proof_only' => [
                'mode' => 'proof_only',
                'label' => 'Submitted',
                'hint' => 'Amounts are locked. Upload or replace proof documents until HR verifies.',
                'can_edit' => false,
                'can_save' => false,
                'can_submit' => false,
                'can_upload_proofs' => $windowOpen,
            ],
            default => [
                'mode' => 'edit',
                'label' => $this->status === self::STATUS_REJECTED ? 'Needs revision' : 'Draft',
                'hint' => $this->status === self::STATUS_REJECTED
                    ? 'Update amounts and proofs, then submit again.'
                    : 'Choose regime, enter amounts, upload proofs, then submit.',
                'can_edit' => $windowOpen,
                'can_save' => $windowOpen,
                'can_submit' => $windowOpen,
                'can_upload_proofs' => $windowOpen,
            ],
        };
    }
}
