<?php

namespace Fifa\ConnectId\Sdk\Util\Builder\Organisation;

use DateTime;
use Fifa\ConnectId\Sdk\Api\Model\ComplianceAndPaymentManagerType;
use Fifa\ConnectId\Sdk\Api\Model\OrganisationLocalType;
use Fifa\ConnectId\Sdk\Api\Model\PictureEmbeddedType;
use Fifa\ConnectId\Sdk\Api\Model\PictureLinkType;

/**
 * Interface OrganisationBuilderInterface
 * @package Fifa\ConnectId\Sdk\Util\Builder\Organisation
 */
interface OrganisationBuilderInterface
{
    /**
     * Gets the organisation type
     *
     * @return OrganisationLocalType
     */
    public function getOrganisationType(): OrganisationLocalType;

    /**
     * Sets organisation id
     *
     * @param string $fifaId
     * @return OrganisationBuilderInterface
     */
    public function setOrganisationFifaId(string $fifaId): OrganisationBuilderInterface;

    /**
     * Sets parent organisation id
     *
     * @param string $parentOrganisationId
     * @return OrganisationBuilderInterface
     */
    public function setParentOrganisationId(string $parentOrganisationId): OrganisationBuilderInterface;

    /**
     * Sets organisation status
     *
     * @param string $status
     * @return OrganisationBuilderInterface
     */
    public function setStatus(string $status): OrganisationBuilderInterface;

    /**
     * Sets organisation nature
     *
     * @param string $organisationNature
     * @return OrganisationBuilderInterface
     */
    public function setOrganisationNature(string $organisationNature): OrganisationBuilderInterface;

    /**
     * Sets organisation official address
     *
     * @param string $country
     * @param string $town
     * @param string $address
     * @param string|null $postalCode
     * @param string|null $region
     * @return OrganisationBuilderInterface
     */
    public function setOfficialAddress(string $country, string $town, string $address, ?string $postalCode = null, ?string $region = null): OrganisationBuilderInterface;

    /**
     * Sets organisation international name
     *
     * @param string $internationalName
     * @return OrganisationBuilderInterface
     */
    public function setInternationalName(string $internationalName): OrganisationBuilderInterface;

    /**
     * Sets international short name
     *
     * @param string $internationalShortName
     * @return OrganisationBuilderInterface
     */
    public function setInternationalShortName(string $internationalShortName): OrganisationBuilderInterface;

    /**
     * Sets web address
     *
     * @param string $webAddress
     * @return OrganisationBuilderInterface
     */
    public function setWebAddress(string $webAddress): OrganisationBuilderInterface;

    /**
     * Sets email address
     *
     * @param string $email
     * @return OrganisationBuilderInterface
     */
    public function setEmail(string $email): OrganisationBuilderInterface;

    /**
     * Sets phone number
     *
     * @param string $phone
     * @return OrganisationBuilderInterface
     */
    public function setPhone(string $phone): OrganisationBuilderInterface;

    /**
     * Sets fax number
     *
     * @param string $fax
     * @return OrganisationBuilderInterface
     */
    public function setFax(string $fax): OrganisationBuilderInterface;

    /**
     * Sets foundation date
     *
     * @param DateTime $date
     * @return OrganisationBuilderInterface
     */
    public function setFoundationDate(DateTime $date): OrganisationBuilderInterface;

    /**
     * Sets DissolutionDate
     *
     * @param DateTime $date
     * @return OrganisationBuilderInterface
     */
    public function setDissolutionDate(DateTime $date): OrganisationBuilderInterface;

    /**
     * Sets logo
     *
     * @param PictureEmbeddedType $embedded
     * @param PictureLinkType $url
     * @return OrganisationBuilderInterface
     */
    public function setLogo(PictureEmbeddedType $embedded, PictureLinkType $url): OrganisationBuilderInterface;

    /**
     * Sets local name
     *
     * @param string $localName
     * @return OrganisationBuilderInterface
     */
    public function setLocalName(string $localName): OrganisationBuilderInterface;

    /**
     * Sets local language
     *
     * @param string $localLanguage
     * @return OrganisationBuilderInterface
     */
    public function setLocalLanguage(string $localLanguage): OrganisationBuilderInterface;

    /**
     * Sets local country
     *
     * @param string $localCountry
     * @return OrganisationBuilderInterface
     */
    public function setLocalCountry(string $localCountry): OrganisationBuilderInterface;

    /**
     * Adds supported discipline to organisation
     *
     * @param string $discipline
     * @param string $gender
     * @return OrganisationBuilderInterface
     */
    public function addSupportedDiscipline(string $discipline, string $gender): OrganisationBuilderInterface;

    /**
     * Adds local name to organisation
     *
     * @param string $language
     * @param string $name
     * @param string|null $shortName
     * @return OrganisationBuilderInterface
     */
    public function addLocalName(string $language, string $name, ?string $shortName = null): OrganisationBuilderInterface;

    /**
     * Adds national identifier to organisation
     *
     * @param string $identifier
     * @param string $nationalIdentifierNature
     * @param string $country
     * @param DateTime|null $dateFrom
     * @param DateTime|null $dateTo
     * @param string|null $description
     * @return OrganisationBuilderInterface
     */
    public function addNationalIdentifier(
        string   $identifier,
        string   $nationalIdentifierNature,
        string   $country,
        DateTime $dateFrom = null,
        DateTime $dateTo = null,
        ?string  $description = null
    ): OrganisationBuilderInterface;

    /**
     * Sets local short name
     *
     * @param string $localShortName
     * @return OrganisationBuilderInterface
     */
    public function setLocalShortName(string $localShortName): OrganisationBuilderInterface;

    /**
     * Sets Local System MA ID
     *
     * @param string $localSystemMaId
     * @return OrganisationBuilderInterface
     */
    public function setLocalSystemMaId(string $localSystemMaId): OrganisationBuilderInterface;


    /**
     * Sets Compliance And Payment Manager
     *
     * @param ComplianceAndPaymentManagerType $complianceAndPaymentManagerType
     * @return OrganisationBuilderInterface
     */
    public function setComplianceAndPaymentManager(ComplianceAndPaymentManagerType $complianceAndPaymentManagerType): OrganisationBuilderInterface;

    /**
     * Sets Club Training Category
     *
     * @param string $clubTrainingCategory
     * @return OrganisationBuilderInterface
     */
    public function setClubTrainingCategory(string $clubTrainingCategory): OrganisationBuilderInterface;
}