railpage/railpagecore

View on GitHub
lib/Locos/Maintainers/Finder.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

/**
 * Find things for maintainers to do
 * @since Version 3.10.0
 * @package Railpage
 * @author Michael Greenhill
 */

namespace Railpage\Locos\Maintainers;

use Railpage\AppCore;
use Railpage\Locos\Locos;
use Railpage\Locos\LocoClass;
use Railpage\Locos\Locomotive;
use Exception;
use InvalidArguementException;

/**
 * Finder
 */

class Finder extends AppCore {
        
    /**
     * Find : Locos classes with no photos
     * @since Version 3.9
     * @const FIND_CLASS_NOPHOTO
     */
    
    const FIND_CLASS_NOPHOTO = "class_nophoto";
    
    /**
     * Find : Locos with no photos
     * @since Version 3.9
     * @const FIND_LOCO_NOPHOTO
     */
    
    const FIND_LOCO_NOPHOTO = "loco_nophoto";
    
    /**
     * Find : Locos in an array of numbers
     * @since Version 3.10.0
     * @const FIND_LOCO_FROMNUMBERS
     */
    
    const FIND_LOCO_FROMNUMBERS = "loco_findfromnumbers";
    
    /**
     * Find : loco or loco class from a supplied tag or list of tags
     * @since Version 3.10.0
     * @const FIND_FROM_TAGS
     */
    
    const FIND_FROM_TAGS = "find_from_tags";
    
    /**
     * Find data for managers to fix
     * @since Version 3.2
     * @version 3.5
     * @param string $search_type
     * @param string $args
     * @return array
     */
    
    public function find($searchType = null, $args = null) {
        if (is_null($searchType)) {
            throw new Exception("Cannot find data - no search type given");
            return false;
        }
        
        /**
         * Find loco classes without a cover photo
         */
        
        if ($searchType === self::FIND_CLASS_NOPHOTO) {
            return $this->findClassNoPhotos(); 
        }
        
        /**
         * Find locomotives without a cover photo
         */
        
        if ($searchType === self::FIND_LOCO_NOPHOTO) {
            return $this->findLocosNoPhotos();
        }
        
        /**
         * Find locomotives from a comma-separated list of numbers
         */
        
        if ($searchType === self::FIND_LOCO_FROMNUMBERS && !is_null($args)) {
            return $this->findLocosFromList($args); 
        }
        
        if ($searchType == self::FIND_FROM_TAGS && !is_null($args)) {
            return $this->findFromTags($args); 
        }
    }
    
    /**
     * Find locos from a list of supplied numbers
     * @since Version 3.10.0
     * @param array $args
     * @return array
     */
    
    private function findLocosFromList($args) {
        $numbers = explode(",", $args); 
        foreach ($numbers as $id => $num) {
            $numbers[$id] = trim($num); 
        }
        
        $query = "SELECT l.loco_id, l.loco_num, l.loco_status_id, s.name AS loco_status, l.loco_gauge_id, 
                         CONCAT(g.gauge_name, ' (', g.gauge_metric, ')') AS loco_gauge, c.loco_type_id, 
                         t.title AS loco_type, c.id AS class_id, c.name AS class_name 
                  FROM loco_unit AS l
                  LEFT JOIN loco_class AS c ON l.class_id = c.id
                  LEFT JOIN loco_status AS s ON s.id = l.loco_status_id
                  LEFT JOIN loco_gauge AS g ON g.gauge_id = l.loco_gauge_id
                  LEFT JOIN loco_type AS t ON c.loco_type_id = t.id
                  WHERE l.loco_num IN ('".implode("','", $numbers)."')
                  ORDER BY l.loco_num, c.name";
        
        $return = array(); 
        
        foreach ($this->db->fetchAll($query) as $row) {
            $return[$row['loco_id']] = $row; 
        }
        
        return $return;

    }
    
    /**
     * Find locos with no photo
     * @since Version 3.10.0
     * @return array
     */
    
    private function findClassNoPhotos() {
        
        $return = array(); 
        
        $classes = $this->listClasses();
        
        foreach ($classes['class'] as $row) {
            
            $LocoClass = new LocoClass($row['class_id']);
            
            if (!$LocoClass->hasCoverImage()) {
                $return[$LocoClass->id] = array(
                    "id" => $LocoClass->id,
                    "name" => $LocoClass->name,
                    "flickr_tag" => $LocoClass->flickr_tag,
                    "url" => $LocoClass->url->getURLs()
                );
            }
        }
        
        return $return;
        
    }
    
    /**
     * Find locomotives with no photo
     * @since Version 3.10.0
     * @return array
     */
    
    private function findLocosNoPhotos() {
        
        $query = "SELECT l.loco_id, l.loco_num, l.loco_status_id, s.name AS loco_status, c.id AS class_id, c.name AS class_name 
                    FROM loco_unit AS l
                    LEFT JOIN loco_class AS c ON l.class_id = c.id
                    LEFT JOIN loco_status AS s ON s.id = l.loco_status_id
                    WHERE l.photo_id = 0
                    ORDER BY c.name, l.loco_num";
        
        $return = array(); 
        
        foreach ($this->db->fetchAll($query) as $row) {
            $return[$row['loco_id']] = $row; 
        }
        
        return $return;
        
    }
    
    /**
     * Find shit from a supplied tag or list of tags
     * @since Version 3.10.0
     * @param array $tags
     * @return array
     */
    
    private function findFromTags($tags) {
        if (!is_array($tags)) {
            $tags = array($tags);
        }
        
        $craptags = array("rp3");
        
        foreach ($tags as $id => $tag) {
            if (in_array($tag, $craptags)) {
                unset($tags[$id]); 
            }
            
            if (preg_match("@railpage\:class\=([0-9]+)@", $tag, $matches)) {
                $classes[] = $matches[1];
            }
            
            if (preg_match("@railpage\:loco\=([a-zA-Z0-9\s\-]+)@", $tag, $matches)) {
                $locos[] = $matches[1];
            }
        }
        
        $return = array(); 
        $liveries = array(); 
        
        // Load class tags from the database
        $query = "SELECT REPLACE(flickr_tag, '-', '') AS flickr_tag, name, id FROM loco_class WHERE flickr_tag != ''";

        $liveries = $this->db->fetchAll($query);
        
        $liveries = array_map(function($row) {
            if (!in_array($row['flickr_tag'], $tags) && !in_array($row['id'], $classes)) {
                 return $row; 
            }
             
            $row['flickr_tag'] = strtolower($row['flickr_tag']);
            
            foreach ($tags as $tag) {
                if (!isset($locos) || !is_array($locos) || count($locos) == 0) {
                    continue;
                }
                
                if ($tag != $row['flickr_tag'] && stristr($tag, $row['flickr_tag']) && !@in_array($tag, $row['locos'])) {
                    $row['locos'][] = strtoupper(str_replace($row['flickr_tag'], "", $tag));
                }
            }
            
            if (isset($row['locos']) && is_array($row['locos'])) {
                natsort($row['locos']);
            }
            
            $return[$row['id']] = $row; 
             
        }, $liveries); 
        
        /*
        foreach ($liveries as $row) {
            if (@in_array($row['flickr_tag'], $tags) || @in_array($row['id'], $classes)) {
                // Back to lowercase, flickr is silly
                $row['flickr_tag'] = strtolower($row['flickr_tag']);
                foreach ($tags as $tag) {
                    if (isset($locos) && is_array($locos) && count($locos) > 0) {
                        if ($tag != $row['flickr_tag'] && stristr($tag, $row['flickr_tag']) && !@in_array($tag, $row['locos'])) {
                            $row['locos'][] = strtoupper(str_replace($row['flickr_tag'], "", $tag));
                        }
                    }
                }
                
                if (isset($row['locos']) && is_array($row['locos'])) {
                    natsort($row['locos']);
                }
                
                $return[$row['id']] = $row; 
            }
        }
        */
        
        return $return;

    }
    
}