<?php

define
('_DAY_IN_SECONDS'24 60 60);
define('_29_GIDOUILLE'28 1);
define('_29_GUEULES'366);

/**
 * Cette classe est un mauvais port de DateTime::Calendar::Pataphysical par Eugene van der Pijll
 * @url http://search.cpan.org/~pijll/DateTime-Calendar-Pataphysical-0.04/lib/DateTime/Calendar/Pataphysical.pm
 *
 * @author    BobArdKor <ardkor@gmail.com>
 * @copyright Le copyright, c'est pour les faibles
 */
class PataDate
{
    
/**
     * Les fetes 'pataphysiques.
     *
     * @todo La version originale distingue les différents types de fetes (Premiere, seconde, vacuations, etc.)
     * Je ne suis pas bien sur que ça vaille la peine d'etre implémenté.
     */
    
static $feasts = [
        
"Nativité d'Alfred Jarry",
        
"St Ptyx, silentiaire (Abolition de)",
        
"St Phénix, solipsiste et St Hyx, factotum",
        
"St Lucien de Samosate, voyageur",
        
"St Bardamu, voyageur",
        
"Ste Vérola, assistante sociale",
        
"St Alambic, abstracteur",
        
"Absinthe, ci-devant St Alfred",
        
"Descente du St Esprit (de Vin)",
        
"Dilution",
        
"Ste Purée, sportswoman",
        
"Vide",
        
"St Canterel, l'illuminateur",
        
"St Sophrotatos l'Arménien, pataphysicien",
        
"Éthernité",
        
"St Ibicrate le Géometre, pataphysicien",
        
"Céphalorgie",
        
"Flutes de Pan",
        
"Stes Grues, ophiophiles",
        
"Ste Mélusine, souillarde de cuisine",
        
"St Venceslas, duc",
        
"Emmanuel Dieu",
        
"Ste Varia-Miriam, amphibie",
        
"Sts Rakirs et Rastrons, porte-côtelettes",
        
"Nativité de Sa Magnificence Opach",
        
"St Joseb, notaire a la mode de Bretagne",
        
"Stes Gigolette et Gaufrette, dogaresses",
        
"Xylostomie",
        
"Le Jet Musical",
        
"L'Âge du Dr Faustroll",
        
"Dissolution d'E. Poe, dinomythurge",
        
"St Gibus, franc-maçon",
        
"Ste Berthe de Courriere, égérie",
        
"Ste Belgique, nourrice",
        
"Ste Tourte, lyrique et Ste Bévue, sociologue",
        
"St Prout, abbé",
        
"Fete du Haha",
        
"Tautologie",
        
"St Panmuphle, huissier",
        
"Sortie de St L. Cranach, apocalypticien",
        
"St Cosinus, savant",
        
"Bse Fenouillard, sainte famille",
        
"Exhibition de la Daromphe",
        
"Nativité de l'OEstre, artificier",
        
"Ste Vadrouille, embleme",
        
"St Homais d'Aquin, prudhomme",
        
"Nativité de Sa Magnificence le baron Mollet (St Pipe)",
        
"St Raphaël, apéritif et philistin",
        
"Strangulation de Bosse-de-Nage",
        
"Zimzoum de Bosse-de-Nage",
        
"Résurrection de Bosse-de-Nage",
        
"Chapeau de Bosse-de-Nage",
        
"St Cl. Terrasse, musicien des Phynances",
        
"St J.-P. Brisset, philologue, prince des penseurs",
        
"Commémoration du Cure-dent",
        
"Occultation d'Alfred Jarry",
        
"Fuite d'Ablou",
        
"Marée Terrestre",
        
"Nativité de Pantagruel",
        
"Ste Rrose Sélavy, héroine",
        
"Couronnement de Lord Patchogue, miroitier",
        
"St Cravan, boxeur",
        
"St Van Meegeren, faussaire",
        
"St Omnibus, satyre",
        
"St Cyrano de Bergerac, explorateur",
        
"St Rimbe, oisif",
        
"Équarrissage pour tous",
        
"St Abstrait, bourreau",
        
"St Ossian, barde postiche",
        
"Dispute du Signe + et du Signe -",
        
"Moustaches du Dr Faustroll",
        
"St P. Bonnard, peintre des Phynances",
        
"Navigation du Dr Faustroll",
        
"St Cap, captain",
        
"St Pangloss, humoriste passif",
        
"St Chambernac, pauvriseur",
        
"St Courtial des Péreires, aérostier et inventeur",
        
"St Olibrius, augure",
        
"St Possible, schizophrene",
        
"St Lautréamont",
        
"St Quincey, critique d'art",
        
"St Berbiguier, martyr",
        
"St Lewis Carroll, professeur",
        
"St Mensonger, éveque",
        
"Ste Visité, fille du précédent",
        
"Nativité de St Swift, chanoine",
        
"Traversée du Miroir",
        
"Noces de Balkis et de Salomon",
        
"St Doublemain, idéologue",
        
"St Phlegmon, doctrinaire",
        
"Ste Barbe (femme a), femme-canon",
        
"Ste Savate, avocate",
        
"St Navet et Ste Perruque, humanistes",
        
"St Birbe, juge",
        
"Conception du P. Ubu (A. J.)",
        
"St Sagouin, homme d'état",
        
"Exaltation d'Ubu Roi (Ubu d'hiver)",
        
"Nativité de St Grabbe, scherziste",
        
"Ste Choupe, mere de famille",
        
"St Flaive, concierge",
        
"Don Quichotte, champion du monde",
        
"Khurmookum du Dr Faustroll",
        
"St Nul, exempt",
        
"St Moyen, français",
        
"Ste Lurette, joconde",
        
"Gravidité de Mere Ubu",
        
"St Sabre, allopathe",
        
"Ste Tape, pompette",
        
"César - Antechrist",
        
"Ste Viole, vierge et martyre",
        
"Ste Pochetée, gouvernante",
        
"Nativité de l'Archéoptéryx",
        
"Monsieur Sisyphe",
        
"St Tic, conjoint",
        
"St Cervelas, penseur",
        
"Aleph",
        
"St Alaodine, virtuose",
        
"Sts Hassassins, praticiens",
        
"Astu",
        
"Décervelage",
        
"Sts Giron, Pile et Cotice, palotins",
        
"Sts Polonais, prolétaires",
        
"Sts Forçats, poliorcetes",
        
"St Bordure, capitaine",
        
"Dormition de Jacques Vaché, interprete",
        
"Drapaud (érection du)",
        
"St Eustache, libérateur",
        
"St Landru, gynécologue",
        
"St Guillotin, médecin",
        
"Sts 4 Sans-Cou, enchanteurs",
        
"Conscience d'Ubu",
        
"St Mauvais, sujet",
        
"St Mandrin, poete et philosophe",
        
"Sts Pirates et Flibustiers, thaumaturges",
        
"St et Ste Cartouche, vétérinaires",
        
"St Outlaw, aristocrate",
        
"Chaire du Dr FaustrolL",
        
"Ostention du Bâton a Physique",
        
"St Tank, animal",
        
"St Weidman, patriarche",
        
"St Petiot, expert",
        
"Escrime",
        
"Sts Chemins de fer, assassins",
        
"Repopulation",
        
"Lit de Procruste",
        
"Dépucelage de Mere Ubu",
        
"St Sigisbée, eunuque",
        
"St Anthropoide, policier",
        
"Ste Goule ou Gudule, institutrice",
        
"Ste Gale, abbesse",
        
"Ste Touche, postulante",
        
"St Gueule, abbé",
        
"Fete de la Chandelle Verte",
        
"Ste Crepe, laique",
        
"St Préservatif, bedeau",
        
"St Baobab, célibataire",
        
"St Membre, compilateur",
        
"Copulation",
        
"Nativité de St J. Verne, globe-trotter en chambre",
        
"Alice au Pays des Merveilles",
        
"St Münchhausen, baron",
        
"Le Bétrou, théurge",
        
"Nativité de St Deibler, prestidigitateur",
        
"St Sade es liens",
        
"St Lafleur, valet",
        
"Lavement",
        
"St Sexe, stylite",
        
"Occultation de St J. Torma, euphoriste",
        
"Conversion de St Matorel, bateleur",
        
"Ste Marmelade, inspirée",
        
"L'Amour Absolu, deliquium",
        
"Ste Tabagie, cosmogene",
        
"Sts Hylactor et Pamphagus",
        
"Mouvement Perpétuel",
        
"Érection du Surmâle",
        
"St André Marcueil, ascete cycliste",
        
"St Ellen, hile",
        
"St Michet, idéaliste",
        
"St Ouducul, trouvere",
        
"Vers Belges",
        
"St Gavroche, forain",
        
"La Machine a Inspirer l'Amour",
        
"St Remezy, éveque in partibus",
        
"Nativité de St Tancrede, jeune homme",
        
"Testament de P. Uccello, le mal illuminé",
        
"St Hari Seldon, psychohistorien galactique",
        
"Ste Valburge, succube",
        
"Sabbat",
        
"Sts Adelphes, ésotéristes",
        
"Sts Templiers, adeptes",
        
"St Dricarpe, prosélyte",
        
"St Nosocome, carabin",
        
"Ste Goutte, fete militaire",
        
"Ste Cuisse, dame patronnesse",
        
"St Inscrit, Converti",
        
"St Sengle, déserteur",
        
"St Masquarade, uniforme",
        
"Nativité de St Stéphane, faune",
        
"St Poligraf Poligrafovitch, chien",
        
"St Pâle, mineur",
        
"St Valens, frere onirique",
        
"Dédicace du Tripode",
        
"Bse Escampette, dynamiteuse",
        
"St Ablou, page et St Haldern, duc",
        
"Sts Hiboux, maîtres-chanteurs",
        
"La Mandragore, solanée androide",
        
"St Pagne, confident",
        
"Sts Aster et Vulpian, violateurs du Néant",
        
"St Ganymede, professionnel",
        
"La Main de Gloire",
        
"La Machine a Peindre",
        
"Ste Trique, lunatique",
        
"Rémission des Poissons",
        
"St Maquereau, intercesseur",
        
"St Georges Dazet, poulpe au regard de soie",
        
"Nativité de Maldoror, corsaire aux cheveux d'or",
        
"Sortie d'A. Dürer, hermétiste",
        
"Invention de la 'Pataphysique",
        
"Exit St Domenico Theotocopouli, el Greco",
        
"St Hiéronymus Bosch, démonarque",
        
"Les 27 Etres Issus des Livres Pairs",
        
"St Barbeau, procureur et Ste Morue, juste",
        
"Capture du Fourneau",
        
"St Docteur Moreau, insulaire",
        
"Fete des Polyedres",
        
"Locus Solus",
        
"St Tupetu de Tupetu, organisateur de loteries",
        
"Exit St Goya, alchimiste",
        
"St Escargot, sybarite",
        
"Ste Hure de Chasteté, pénitente",
        
"St Turgescent, iconoclaste",
        
"Cymbalum Mundi",
        
"Sts Crocodiles, crocodiles",
        
"Fete des écluses",
        
"Sts Trolls, pantins",
        
"Ste Susan Calvin, docteur",
        
"Ste Poignée, veuve et Ste Jutte, recluse",
        
"Ste Oneille, gourgandine",
        
"St Fénéon es Liens",
        
"St Bougrelas, prince",
        
"Sts Boleslas et Ladislas, polonais",
        
"St Forficule, Barnabite",
        
"Explosion du Palotin",
        
"Réprobation du Travail",
        
"Esquive de St Léonard (de Vinci), illusionniste",
        
"St Équivoque, sans-culotte",
        
"Adoration du Pal",
        
"Déploration de St Achras, éleveur de Polyedres",
        
"St Macrotatoure, caudataire",
        
"Canotage",
        
"Occultation de St Gauguin, océanide",
        
"St Ti Belot, séide",
        
"Occultation de Sa Magnificence le Dr Sandomir",
        
"Sts Palotins des Phynances",
        
"Sts Quatrezoneilles, Herdanpo, Mousched-Gogh, palotins",
        
"Ste Lumelle, écuyere",
        
"Sts Potassons, acolythes",
        
"Ste Prétentaine, rosiere",
        
"St Foin, coryphée",
        
"Nativité de St Satie, Grand Parcier de l'Église d'Art",
        
"Erratum",
        
"Accouchement de Ste Jeanne, papesse",
        
"Le Moutardier du Pape",
        
"St Siege, sous-pape",
        
"Nativité de St H. Rousseau, douanier",
        
"St Crouducul, troupier",
        
"St Cucufat, mécene",
        
"Nativité de M. Plume, propriétaire",
        
"Cocuage de M. le P. Ubu",
        
"Vidange",
        
"St Barbapoux, amant",
        
"St Memnon, vidangeur",
        
"Stes Miches, catéchumenes",
        
"Ste Lunette, solitaire",
        
"St Sphincter, profes",
        
"Sts Serpents d'Airain",
        
"Nativité de St Donatien A. François",
        
"St Woland, professeur",
        
"St Anal, cordelier et Ste Foire, anagogue",
        
"Ste Fétatoire, super",
        
"Ste Colombine, expurgée",
        
"Ste Pyrotechnie, illuminée",
        
"Ontogénie Pataphysique",
        
"Interprétation de L'Umour",
        
"Ste Purge, sage-femme",
        
"Apparition D'Ubu Roi",
        
"Ste Barbaque, naiade",
        
"Sts Courts et Longs, gendarmes",
        
"St Raca, cagot",
        
"Défaite du Mufle",
        
"Ste Bouzine, esprit",
        
"St Lucullus, amateur (Bloomsday)",
        
"Ste Dondon, amazone",
        
"Ste Tripe, républicaine",
        
"St Ugolin, mansuet",
        
"St Dieu, retraité",
        
"St Bébé Toutout, évangéliste",
        
"Ste Boudouille, bayadere",
        
"Ste Outre, psychiatre",
        
"St Boudin, recteur",
        
"Sacre de Talou VII, empereur du Ponukélé",
        
"Ste Confiture, dévote et Ste Cliche, donatrice",
        
"Sts Instintestins, conseillers intimes",
        
"St Colon, artilleur",
        
"Ste Giborgne, vénérable",
        
"St Inventaire, poete",
        
"Ste Femelle, technicienne",
        
"Visitation de Mere Ubu",
        
"St Sein, tautologue",
        
"St Périnée, zélateur",
        
"St Spéculum, confesseur",
        
"Fete de Gidouille",
        
"St Ombilic, gymnosophiste",
        
"St Gris-gris, ventre",
        
"St Bouffre, pontife",
        
"Ste Goulache, odalisque",
        
"Ste Gandouse, hygiéniste",
        
"Poche du Pere Ubu",
        
"Nom d'Ubu",
        
"Fete du P. Ubu (Ubu d'été)",
        
"Commémoration du P. Ébé",
        
"Ste Crapule, puriste et St Fantomas, archange",
        
"Ascension du Mouchard, statisticien, psychiatre et policier",
        
"St Arsouille, patricien",
        
"Sts Robot et Cornard, citoyens",
        
"St Biribi, taulier",
        
"Susception du Croc a Merdre",
        
"Sts Écrase-Merdre, sectateurs",
        
"Sts Pieds Nickelés, trinité",
        
"Stes Canicule et Canule, jouvencelles",
        
"Sts Cannibales, philanthropes",
        
"St Dada, prophete",
        
"Ste Anne, pelerine, énergumene",
        
"Procession aux Phynances",
        
"Transfiguration de St V. van Gogh, transmutateur",
        
"Ste Flamberge, voyante",
        
"St Trou, chauffeur",
        
"Ste Taloche, matrone",
        
"St Tiberge, frere queteur",
        
"Sts Catoblepas, lord et Anoblepas, amiral",
        
"Ubu es Liens",
        
"St Pissembock, oncle",
        
"St Pissedoux, caporal des hommes libres",
        
"St Panurge, moraliste",
        
"St Glé, neurologue-aliéniste",
        
"St Pistolet a Merdre, jubilaire",
        
"Nativité de St Bruggle",
        
"Le soleil solide froid",
        
"St Chibre, planton",
        
"Ste Ruth, zélatrice",
        
"St Zebb, passe-partout",
        
"St Mnester, confesseur",
        
"Assomption de Ste Messaline",
        
"Penis Angelicus",
        
"St Patrobas, pompier",
        
"Ste Léda, ajusteuse",
        
"St Godemiché, économe",
        
"Ste Nitouche, orante",
        
"Ste Lechefrite, botteuse",
        
"Ste Andouille, amphibologue",
        
"Ste Bitre, ouvreuse et St Étalon, couvreur",
        
"Bataille de Morsang",
        
"Mort de Dionysos, surhomme",
        
"Nativité de St Vibescu, pohete et Commémoration de Ste Cuculine d'Ancône",
        
"Ste Gallinacée, cocotte",
        
"St Lingam, bouche-trou",
        
"St Prélote, capucin",
        
"St Pie VIII, navigant",
        
"St Erbrand, polytechnicien",
        
"Ste Dragonne, pyrophage",
        
"St Lazare, gare",
        
"Ste Orchidée, aumoniere",
        
"Nativité apparente d'Artaud le Momo",
        
"Disparition de l'Ancien Breughel, incendiaire",
        
"St Priape, franc-tireur",
        
"Transfixion de Ste Messaline",
        
"Le Termes"
    
];

    
/**
     * Les 13 mois de l'année pataphysique
     */
    
static $months = [
        
"Absolu",
        
"Haha",
        
"As",
        
"Sable",
        
"Décervelage",
        
"Gueules",
        
"Pédale",
        
"Clinamen",
        
"Palotin",
        
"Merdre",
        
"Gidouille",
        
"Tatane",
        
"Phalle"
    
];

    
/**
     * Date grégorienne
     */
    
public $g = ['y''m''d'];

    
/**
     * Date pataphysique
     */
    
public $p = ['y''m''d'];

    
/**
     * Les jours de la semaine (cf. PataDate::set_weekdays)
     */
    
public $weekdays = [];

    
/**
     * Constructeur de la classe PataDate
     *
     * @param integer $y      L'année selon le cal. grégorien
     * @param integer $m      Le mois selon le cal. grégorien
     * @param integer $d      Le jour selon le cal. grégorien
     * @param string  $locale La locale voulue (pour le nom des jours de la semaine)
     */
    
public function __construct($y false$m false$d false$locale "fr_FR.utf8")
    {
        
$this->g['y'] = $y ? (int) $y date('Y');
        
$this->g['m'] = $m ? (int) $m date('m');
        
$this->g['d'] = $d ? (int) $d date('d');
        
$this->set_weekdays($locale);
        
$this->self::convert_to_pata($this->g);
    }

    
/**
     * Retourne le nom du mois d'apres son n°
     *
     * @param (integer|false) Le n° du mois voulu, le mois en cours si false
     *
     * @return string Le nom du mois
     */
    
static function get_month_name($n false)
    {
        
$n $n ? (int) $n date('m');
        return 
self::$months[$n 1];
    }

    
/**
     * Convertit une date du format grégorien en pataphysique
     *
     * @param string $date La date, au format d-m-Y
     *
     * @return array Un tableau associatif contenant le jour (d) le mois (m) et l'année (y) pataphysiques
     */
    
static function convert_to_pata($date)
    {
        
/* Algorithm similar to the one on
         http://home.capecod.net/~pbaum/date/injdalg2.htm
         for the gregorian calendar
         Number of days since 1 Pedale 127 (day after first extra leap day) = 24-02-2000 */
        
$dtt DateTime::createFromFormat('d-m-Y'$date['d'] . '-' $date['m'] . '-' $date['y']);
        
$dtt->add(new DateInterval('P1D'));
        
$rd $dtt->format('U');
        
$rd = (int) ($rd _DAY_IN_SECONDS 719163); #what. the.
        
$rd -= 730173;    # ..fuck? #    date('d-m-Y', (730173 - 719163) * _DAY_IN_SECONDS)) == '23-02-2000'
        
$a  floor(($rd 0.25) / (100 365.2425));
        
$b  $rd 0.25 $a floor($a 4);
        
$y  floor($b 365.25);
        
$d  $rd $a floor($a 4) - floor(365.25 $y);
        if (
$d _29_GIDOUILLE) {
            
$m floor(($d 1) / 28);
            
$d -= $m 28;
        } elseif (
$d == _29_GIDOUILLE) {
            
$m 4;
            
$d 29;
        } elseif (
$d _29_GUEULES) {
            
$m floor(($d 2) / 28);
            
$d -= $m 28 1;
        } else { 
// 29 Gueules
            
$m 12;
            
$d 29;
        }
        
$y += 127;
        
$m += 7;
        if (
$m 13) {
            
$m -= 13;
            
$y++;
        }
        if (
$y <= 0) { // no year 0;
            
$y--;
        }
        return [
'y' => $y'm' => $m'd' => $d];
    }

    
/**
     * Représentation de la date pataphysique
     *
     * @return string La date au format HTML
     */
    
public function __toString()
    {
        return 
'<p>' $this->get_date() . '<br><em>' $this->get_feast() . '</em></p>';
    }

    
/**
     * Retourne le nom du jour actuel de la semaine
     *
     * @return string Le nom du jour
     */
    
public function get_day_of_week()
    {
        if (
$this->p['d'] == 29) {
            return 
"Hunyadi";
        }
        return 
$this->weekdays[($this->p['d'] - 1) % 7];
    }

    
/**
     * Retourne le n° du jour dans l'année
     *
     * @return integer Le n° du jour
     */
    
public function get_day_of_year()
    {
        return 
$this->p['d'] + ($this->p['m'] - 1) * 29 1;
    }

    
/**
     * Renvoie la date selon le calendrier pataphysique
     *
     * @return string [Nom du jour] [n°jour] [nom du mois] [année]
     */
    
public function get_date()
    {
        return 
$this->get_day_of_week() . ' ' $this->p['d'] . ' ' self::get_month_name($this->p['m']) . ' ' $this->p['y'];
    }

    
/**
     * Renvoie la fete correspondant au jour actuel de l'année
     *
     * @return string Le nom de la fete
     */
    
public function get_feast()
    {
        return 
self::$feasts[$this->get_day_of_year()];
    }

    
/**
     * Liste le nom des jours de la semaine dans la locale voulue
     *
     * @param string $locale
     */
    
private function set_weekdays($locale)
    {
        
$days       = [];
        
$old_locale setlocale(LC_TIME'0');

        for (
$i $i $i++) {
            
setlocale(LC_TIME$locale);
            
$days[] = ucfirst(strftime('%A'strtotime("next Sunday + " $i " days")));
        }
        
setlocale(LC_TIME$old_locale);
        
$this->weekdays $days;
    }

}