<?php

namespace App\Models;

use App\Tables\Column;
use Illuminate\Support\Collection;
use Riesjart\Relaquent\Model\Concerns\HasRelaquentRelationships;

/**
 * Table revision (a set of rows)
 *
 * @property int $id
 * @property \Carbon\Carbon $created_at
 * @property \Carbon\Carbon $updated_at
 * @property int $ancestor_id
 * @property string $note
 * @property object $columns
 * @property int $row_count - cached number of rows in the revision
 * @property-read Revision|null $parentRevision
 * @property-read Row[]|Collection $rows
 * @property-read Proposal|null $sourceProposal - proposal that was used to create this revision
 * @property-read Proposal[]|Collection $dependentProposals
 */
class Revision extends BaseModel
{
    use HasRelaquentRelationships;
    protected $guarded = [];

    protected $casts = [
        'columns' => 'object',
    ];

    /** Included rows */
    public function rows()
    {
        return $this->belongsToMany(Row::class, 'revision_row_pivot')->as('_row_pivot');
    }

    /** Included rows
     * @param Column[] $columns
     * @return \Illuminate\Database\Query\Builder|static
     */
    public function rowsData($columns, $withId=true, $named=true)
    {
        $selects = $withId ? ["data->>'_id' as _id"] : [];

        foreach ($columns as $col) {
            $selects[] = "data->>'$col->id' as " . ($named ? $col->name : $col->id);
        }

        return $this->rows()->select([])->selectRaw(implode(', ', $selects));
    }

    /** Proposal that lead to this revision */
    public function sourceProposal()
    {
        return $this->hasOneThrough(Proposal::class, 'revision_proposal_pivot');
    }

    /** Proposals that depend on this revision */
    public function dependentProposals()
    {
        return $this->hasMany(Proposal::class);
    }

    /** Revision this orignates from */
    public function parentRevision()
    {
        return $this->belongsTo(Revision::class, 'ancestor_id');
    }

    /** Tables referencing this revision */
    public function tables()
    {
        return $this->belongsToMany(Table::class, 'table_revision_pivot');
    }
}