<?php namespace F13\Github\Controllers;


class Profile_widget extends \WP_Widget
{
    public $cache;
    var $textdomain;
    var $fields;

    function __construct( $cache = 1 )
    {
        $this->cache = $cache;
        $this->textdomain = strtolower(get_class($this));

        $this->add_field('title', 'Enter title', '', 'text');

        parent::__construct($this->textdomain, __('GitHub Profile Widget', 'f13-github'), array( 'description' => __('Some description', 'f13-github'), 'classname' => 'f13-github'));
    }

    public function widget($args, $instance)
    {
        $cache_key = 'f13_github_profile_'.sha1(serialize($instance));

        $cache = get_transient( $cache_key );
        if ( $cache ) {
            echo '<script>console.log("Building github widget from transient: '.$cache_key.'");</script>';
            echo $cache;
            return;
        }

        $m = new \F13\Github\Models\Git_api();

        $data = $m->get_user( );
        $starred = $m-> get_starred_count( );

        $v = new \F13\Github\Views\Profile_widget(array(
            'args' => $args,
            'instance' => $instance,
            'data' => $data,
            'starred' => $starred,
        ));

        $return = $v->widget();

        set_transient($cache_key, $return, $this->cache);
        echo '<script>console.log("Building github widget from API, setting transient: '.$cache_key.'");</script>';

        echo $return;
    }

    public function form( $instance )
    {
        $v = '<p>Set your GitHub API tokens in the <a href="'.admin_url('admin.php').'?page=f13-settings-github">F13 Admin menu</a></p>';
        foreach($this->fields as $field_name => $field_data)
        {
            if($field_data['type'] === 'text')
            {
                $v .= '<p>';
                    $v .= '<label for="'.$this->get_field_id($field_name).'">'._e($field_data['description'], $this->textdomain ).'</label>';
                    $v .= '<input class="widefat" id="'.$this->get_field_id($field_name).'" name="'.$this->get_field_name($field_name).'" type="text" value="'.esc_attr(isset($instance[$field_name]) ? $instance[$field_name] : $field_data['default_value']).'" />';
                $v .= '</p>';
            }
            elseif($field_data['type'] === 'number')
            {
                $v .= '<p>';
                    $v .= '<label for="'.$this->get_field_id($field_name).'">'._e($field_data['description'], $this->textdomain ).'></label>';
                    $v .= '<input class="widefat" id="'.$this->get_field_id($field_name).'" name="'.$this->get_field_name($field_name).'" type="number" value="'.esc_attr(isset($instance[$field_name]) ? $instance[$field_name] : $field_data['default_value']).'" />';
                $v .= '</p>';
            }
            elseif($field_data['type'] === 'password')
            {
                $v .= '<p>';
                    $v .= '<label for="'.$this->get_field_id($field_name).'">'._e($field_data['description'], $this->textdomain ).'</label>';
                    $v .= '<input class="widefat" id="'.$this->get_field_id($field_name).'" name="'.$this->get_field_name($field_name).'" type="password" value="'.esc_attr(isset($instance[$field_name]) ? $instance[$field_name] : $field_data['default_value']).'" />';
                $v .= '</p>';
            }
            elseif($field_data['type'] === 'checkbox')
            {
                $v .= '<p>';
                    $v .= '<label for="'.$this->get_field_id($field_name).'">'._e($field_data['description'], $this->textdomain ).'</label><br />';
                    $v .= '<input id="'.$this->get_field_id($field_name).'" name="'.$this->get_field_name($field_name).'" type="checkbox"';
                    if (esc_attr($instance[$field_name]) == true)
                    {
                        $v .= ' checked';
                    }
                    $v .= '/>';
                $v .= '</p>';
            }
            /* Otherwise show an error */
            else
            {
                $v .= __('Error - Field type not supported', $this->textdomain) . ': ' . $field_data['type'];
            }
        }

        echo $v;
    }

    public function update($new_instance, $old_instance)
    {
        return $new_instance;
    }

    private function add_field($field_name, $field_description = '', $field_default_value = '', $field_type = 'text')
    {
        if(!is_array($this->fields))
            $this->fields = array();

        $this->fields[$field_name] = array('name' => $field_name, 'description' => $field_description, 'default_value' => $field_default_value, 'type' => $field_type);
    }
}