<?php
declare(strict_types=1);

namespace App\Service\Dolibarr;

use App\Enum\Organization\SettingsProductEnum;
use App\Service\Utils\DatesUtils;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\EntityManagerInterface;
use Exception;

class DolibarrUtils
{
    const ARTIST_STANDARD_CMF_PRODUCT_ID = 283;
    const ARTIST_PREMIUM_TRIAL_PRODUCT_ID = 598;
    const ARTIST_PREMIUM_PRODUCT_ID = 281;
    const ARTIST_PREMIUM_CMF_PRODUCT_ID = 282;

    public function __construct(
        private Connection $dolibarrConnection,
    ) {}

    /**
     * Retourne l'id Dolibarr du produit donné, selon le produit possédé et l'appartenance
     * ou non au réseau CMF.
     *
     * @param SettingsProductEnum $contractType Produit concerné (@see SettingsProductEnum)
     * @param bool $isTrial
     * @param bool $isCmf
     * @return int
     */
    public function getProductId(
        SettingsProductEnum $contractType,
        bool $isTrial = false,
        bool $isCmf = false
    ): int {
        if ($contractType === SettingsProductEnum::ARTIST_PREMIUM && $isTrial) {
            return self::ARTIST_PREMIUM_TRIAL_PRODUCT_ID;
        } else if ($contractType === SettingsProductEnum::ARTIST_PREMIUM && $isCmf) {
            return self::ARTIST_PREMIUM_CMF_PRODUCT_ID;
        } else if ($contractType === SettingsProductEnum::ARTIST_PREMIUM) {
            return self::ARTIST_PREMIUM_PRODUCT_ID;
        } else if ($contractType === SettingsProductEnum::ARTIST && $isCmf) {
            return self::ARTIST_STANDARD_CMF_PRODUCT_ID;
        } else {
            throw new \InvalidArgumentException("Invalid contract type");
        }
    }

    /**
     * Exécute une requête SQL sur la DB Dolibarr
     *
     * @throws \Doctrine\DBAL\Exception
     */
    protected function executeQuery(string $sql): void
    {
        $this->dolibarrConnection->executeQuery($sql);
    }

    /**
     * Remplace le ou les commerciaux actuellement affectés à la société par l'utilisateur 'api'
     * (pas de solution trouvée via l'API)
     *
     * @param int $societyId
     * @return void
     * @throws \Doctrine\DBAL\Exception
     */
    public function updateSocietyCommercialsWithApi(int $societyId) {
        $apiUserId = 8;

        $this->executeQuery(
            "DELETE FROM llx_societe_commerciaux WHERE fk_soc = $societyId"
        );

        $this->executeQuery(
            "INSERT INTO llx_societe_commerciaux (fk_soc, fk_user) 
                   VALUES ($societyId, $apiUserId)"
        );
    }

    /**
     * Enregistre une entrée dans le journal des actions commercial de la société Dolibarr
     * (pas de solution trouvée via l'API)
     *
     * @param int $societyId
     * @param string $title
     * @param string $message
     * @return void
     * @throws Exception
     */
    public function addActionComm(int $societyId, string $title, string $message): void
    {
        $tz = new \DateTimeZone('Europe/Paris');
        $now = DatesUtils::new('now', $tz)->format('Y-m-d H:i:s');
        $apiUserId = 8;

        $this->executeQuery(
            "INSERT INTO llx_actioncomm (fk_soc, ref, code, label, note, datep, datep2, datec, fk_user_author, fk_user_mod, fk_user_action, percent) 
                   VALUES ($societyId, -1, 'AC_OT_ONLINE_STORE', '$title', '$message', '$now', '$now', '$now', $apiUserId, $apiUserId, $apiUserId, -1)"
        );
    }

    /**
     * Retourne le nom du produit dans Dolibarr
     *
     * @param SettingsProductEnum $contractType Produit concerné (@see SettingsProductEnum)
     * @param bool $isTrial
     * @return string|null
     */
    public function getDolibarrProductName(SettingsProductEnum $contractType, bool $isTrial = false): ?string
    {
        return match ($contractType) {
            SettingsProductEnum::ARTIST => "Opentalent Artist",
            SettingsProductEnum::ARTIST_PREMIUM => $isTrial ? "Opentalent Artist Premium (Essai)" : "Opentalent Artist Premium",
            SettingsProductEnum::SCHOOL => "Opentalent School",
            SettingsProductEnum::SCHOOL_PREMIUM => $isTrial ? "Opentalent School Premium (Essai)" : "Opentalent School Premium",
            SettingsProductEnum::MANAGER => "Opentalent Manager",
            SettingsProductEnum::MANAGER_PREMIUM => "Opentalent Manager Premium",
            default => null,
        };
    }
}
