<?php
namespace PrestaShop\Module\PolarisPrestaConnector\Models;

use DateTime;

/**
 * Objet d'interface contenant la définition d'un client
 */
class Customer extends SanitizedObject
{
    /**
     * Adresse mail du client
     * 
     * @param string Adresse mail du client
     */    
    public string $mail;    

    /**
     * UID du client prestashop si connu, ou null autrement
     */
    public string|null $uid = null;

    /**
     * Doit être effacé
     */
    public bool $delete = false;

    /**
     * Civilité
     */
    public string|null $civilite = null;

    /**
     * Raison sociale du client
     */
    public string|null $company = null;

    /**
     * Nom du client
     */
    public string|null $lastname;

    /**
     * Prénom du client
     */
    public string|null $firstname;

    /**
     * Ok pour la newsletter
     */
    public bool|null $newsletter = null;

    /**
     * Démarchage ok
     */
    public bool|null $demarchage = null;
    
    /**
     * Nouvelles informations clients
     * 
     * @param string|null $uid Identifiant du client
     * @param string $mail Adresse mail du client
     */
    public function __construct(
        string|null $uid,
        string $mail,
        )
    {
        // Sanitize
        $this->uid = $uid;
        $this->mail = $mail;
    }

    /**
     * Calcule la référence externe d'un client (appelée uuid ici)
     * Prend en compte l'id local, mais également la date d'ajout des clients pour éviter un retour
     * en arrière problèmatique.
     * Traduit la date en timestamp et la converti en base64 puis la concatène à l'id client.
     * 
     * @param \Customer $customer Client chargé
     */
    public static function getCustomerUid(\Customer $customer): string
    {
        // Recrée une date à partir du timestamp pour vérifier que c'est bon
        return $customer->id . '-' . str_replace('-', '', str_replace(':', '', str_replace(' ', '', $customer->date_add)));
    }

    /**
     * Calcule la référence externe d'un client (appelée uuid ici)
     * Prend en compte l'id local, mais également la date d'ajout des clients pour éviter un retour
     * en arrière problèmatique.
     * Traduit la date en timestamp et la converti en base64 puis la concatène à l'id client.
     * 
     * @param \Customer $customer Client chargé
     */
    public static function extractIdFromUid(?string $uid): string
    {
        // Recrée une date à partir du timestamp pour vérifier que c'est bon
        if (!$uid)
            return '0';
        $parts = explode('-', $uid);
        return $parts[0];
    }

    /**
     * Nettoyage de la donnée sur les standards Prestashop
     */
    public function sanitize()
    {       
        if ($this->civilite)
            $this->civilite = mb_strtoupper($this->sanitizeStr($this->civilite, 4));

        if ($this->company)
            $this->company = mb_strtoupper($this->sanitizeStr($this->company, 128, '', ' '));
        $this->lastname = mb_strtoupper(ltrim($this->sanitizeStr($this->lastname ?? '', 32)));
        $this->firstname = mb_ucwords(ltrim($this->sanitizeStr($this->firstname ?? '', 32)));

        // Trim all number from firstname
        $this->firstname = preg_replace('/\d/', '', $this->firstname);

        $this->mail = strtolower(ltrim($this->mail));

        if (empty($this->lastname))
            $this->lastname = "INCONNU";

        if (empty($this->firstname))
            $this->firstname = "Inconnu"; 
    }
}