<?php

namespace App\Modules\BookingTour\Domain;

use App\Modules\Booking\Domain\IdBooking;
use App\Modules\BookingTour\Domain\IdBookingTour;
use App\Modules\LodgingPlace\Domain\IdLodgingPlace;
use App\Modules\Package\Domain\IdPackage;
use App\Modules\Shared\Domain\Aggregate\AggregateAttribute;
use App\Modules\Shared\Domain\Aggregate\AggregateRoot;
use App\Modules\Tour\Domain\IdTour;

class BookingTourModel extends AggregateRoot
{
    /** @return AgregateAttribute[] */
    protected static function attributes(): array
    {
        return [
            new AggregateAttribute('id', IdBookingTour::class, 'Id_BookingTour', 'primary'),
            new AggregateAttribute('date', BookingTourDate::class, 'BookingTour_Date'),
            new AggregateAttribute('dateStart', BookingTourDateStart::class, 'BookingTour_DateStart'),
            new AggregateAttribute('pickUp', BookingTourPickUp::class, 'BookingTour_PickUp'),
            new AggregateAttribute('type', BookingTourType::class, 'BookingTour_Type'),
            new AggregateAttribute('noPax', BookingTourNoPax::class, 'BookingTour_NoPax'),
            new AggregateAttribute('name', BookingTourName::class, 'BookingTour_Name'),
            new AggregateAttribute('tourName', BookingTourTourName::class, 'BookingTour_TourName'),
            new AggregateAttribute('feeType', BookingTourFeeType::class, 'BookingTour_FeeType'),
            new AggregateAttribute('full', BookingTourFull::class, 'BookingTour_Full'),
            new AggregateAttribute('minimumFull', BookingTourMinimumFull::class, 'BookingTour_MinimumFull'),
            new AggregateAttribute('group', BookingTourGroup::class, 'BookingTour_Group'),
            new AggregateAttribute('tourDuration', BookingTourTourDuration::class, 'BookingTour_TourDuration'),
            new AggregateAttribute('dateBriefing', BookingTourDateBriefing::class, 'BookingTour_DateBriefing'),
            new AggregateAttribute('placeBriefing', BookingTourPlaceBriefing::class, 'BookingTour_PlaceBriefing'),
            new AggregateAttribute('useBookingPlaceBriefing', BookingTourUseBookingPlaceBriefing::class, 'BookingTour_UseBookingPlaceBriefing'),
            new AggregateAttribute('status', BookingTourStatus::class, 'BookingTour_Status'),
            new AggregateAttribute('idBooking', IdBooking::class, 'Id_Booking'),
            new AggregateAttribute('idPackage', IdPackage::class, 'Id_Package'),
            new AggregateAttribute('idTour', IdTour::class, 'Id_Tour'),
            new AggregateAttribute('idLodgingPlacePickUp', IdLodgingPlace::class, 'Id_LodgingPlace_PickUp'),
            new AggregateAttribute('idLodgingPlaceDropOff', IdLodgingPlace::class, 'Id_LodgingPlace_DropOff'),
        ];
    }

    public static function table(): string
    {
        return 't_booking_tour';
    }

    public function __construct(
        protected IdBookingTour  $id,
        protected BookingTourDate $date,
        protected BookingTourDateStart $dateStart,
        protected BookingTourPickUp $pickUp,
        protected BookingTourType $type,
        protected BookingTourNoPax $noPax,
        protected BookingTourName $name,
        protected BookingTourTourName $tourName,
        protected BookingTourFeeType $feeType,
        protected BookingTourFull $full,
        protected BookingTourMinimumFull $minimumFull,
        protected BookingTourGroup $group,
        protected BookingTourTourDuration $tourDuration,
        protected BookingTourDateBriefing $dateBriefing,
        protected BookingTourPlaceBriefing $placeBriefing,
        protected BookingTourUseBookingPlaceBriefing $useBookingPlaceBriefing,
        protected BookingTourStatus $status,
        protected IdBooking $idBooking,
        protected IdPackage $idPackage,
        protected IdTour $idTour,
        protected IdLodgingPlace $idLodgingPlacePickUp,
        protected IdLodgingPlace $idLodgingPlaceDropOff
    ) {}




    public function id(): IdBookingTour
    {
        return $this->id;
    }
    public function date(): BookingTourDate
    {
        return $this->date;
    }
    public function dateStart(): BookingTourDateStart
    {
        return $this->dateStart;
    }
    public function pickUp(): BookingTourPickUp
    {
        return $this->pickUp;
    }
    public function type(): BookingTourType
    {
        return $this->type;
    }
    public function noPax(): BookingTourNoPax
    {
        return $this->noPax;
    }
    public function name(): BookingTourName
    {
        return $this->name;
    }
    public function tourName(): BookingTourTourName
    {
        return $this->tourName;
    }
    public function feeType(): BookingTourFeeType
    {
        return $this->feeType;
    }
    public function full(): BookingTourFull
    {
        return $this->full;
    }
    public function minimumFull(): BookingTourMinimumFull
    {
        return $this->minimumFull;
    }
    public function group(): BookingTourGroup
    {
        return $this->group;
    }
    public function tourDuration(): BookingTourTourDuration
    {
        return $this->tourDuration;
    }
    public function dateBriefing(): BookingTourDateBriefing
    {
        return $this->dateBriefing;
    }
    public function placeBriefing(): BookingTourPlaceBriefing
    {
        return $this->placeBriefing;
    }
    public function useBookingPlaceBriefing(): BookingTourUseBookingPlaceBriefing
    {
        return $this->useBookingPlaceBriefing;
    }
    public function status(): BookingTourStatus
    {
        return $this->status;
    }
    public function idBooking(): IdBooking
    {
        return $this->idBooking;
    }
    public function idPackage(): IdPackage
    {
        return $this->idPackage;
    }
    public function idTour(): IdTour
    {
        return $this->idTour;
    }
    public function idLodgingPlacePickUp(): IdLodgingPlace
    {
        return $this->idLodgingPlacePickUp;
    }
    public function idLodgingPlaceDropOff(): IdLodgingPlace
    {
        return $this->idLodgingPlaceDropOff;
    }
    // ----------------------------------------------------------------------------------------------

    public function setId(IdBookingTour $id): void
    {
        $this->id = $id;
    }
    public function setDate(BookingTourDate $date): void
    {
        $this->date = $date;
    }
    public function setDateStart(BookingTourDateStart $dateStart): void
    {
        $this->dateStart = $dateStart;
    }
    public function setPickUp(BookingTourPickUp $pickUp): void
    {
        $this->pickUp = $pickUp;
    }
    public function setType(BookingTourType $type): void
    {
        $this->type = $type;
    }
    public function setNoPax(BookingTourNoPax $noPax): void
    {
        $this->noPax = $noPax;
    }
    public function setName(BookingTourName $name): void
    {
        $this->name = $name;
    }
    public function setTourName(BookingTourTourName $tourName): void
    {
        $this->tourName = $tourName;
    }
    public function setFeeType(BookingTourFeeType $feeType): void
    {
        $this->feeType = $feeType;
    }
    public function setFull(BookingTourFull $full): void
    {
        $this->full = $full;
    }
    public function setMinimumFull(BookingTourMinimumFull $minimumFull): void
    {
        $this->minimumFull = $minimumFull;
    }
    public function setGroup(BookingTourGroup $group): void
    {
        $this->group = $group;
    }
    public function setTourDuration(BookingTourTourDuration $tourDuration): void
    {
        $this->tourDuration = $tourDuration;
    }
    public function setDateBriefing(BookingTourDateBriefing $dateBriefing): void
    {
        $this->dateBriefing = $dateBriefing;
    }
    public function setPlaceBriefing(BookingTourPlaceBriefing $placeBriefing): void
    {
        $this->placeBriefing = $placeBriefing;
    }
    public function setUseBookingPlaceBriefing(BookingTourUseBookingPlaceBriefing $useBookingPlaceBriefing): void
    {
        $this->useBookingPlaceBriefing = $useBookingPlaceBriefing;
    }
    public function setStatus(BookingTourStatus $status): void
    {
        $this->status = $status;
    }
    public function setIdBooking(IdBooking $idBooking): void
    {
        $this->idBooking = $idBooking;
    }
    public function setIdPackage(IdPackage $idPackage): void
    {
        $this->idPackage = $idPackage;
    }
    public function setIdTour(IdTour $idTour): void
    {
        $this->idTour = $idTour;
    }
    public function setIdLodgingPlacePickUp(IdLodgingPlace $idLodgingPlacePickUp): void
    {
        $this->idLodgingPlacePickUp = $idLodgingPlacePickUp;
    }
    public function setIdLodgingPlaceDropOff(IdLodgingPlace $idLodgingPlaceDropOff): void
    {
        $this->idLodgingPlaceDropOff = $idLodgingPlaceDropOff;
    }
}
