import ckan.plugins.toolkit as toolkit
from flask import Blueprint
from flask import request
import ckan.views.feed as ckan_feed
from ckan.common import config
import ckan.lib.helpers as h
import logging

log = logging.getLogger(__name__)

blueprint = Blueprint('odsh_feed', __name__)

def custom():
  extra_fields = ['ext_startdate', 'ext_enddate',
                  'ext_bbox', 'ext_prev_extent']
  q = request.args.get(u'q', u'')
  fq = u''
  search_params = {}
  extras = {}
  for (param, value) in request.args.items():
      if param not in [u'q', u'page', u'sort'] + extra_fields \
              and len(value) and not param.startswith('_'):
          search_params[param] = value
          fq += ' %s:"%s"' % (param, value)
      if param in extra_fields:
          extras[param] = value
  search_params['extras'] = extras

  page = h.get_page_number(request.args)

  limit = int(config.get('ckan.feeds.limit', 10))
  data_dict: dict[str, Any] = {
      u'q': q,
      u'fq': fq,
      u'start': (page - 1) * limit,
      u'rows': limit,
      u'sort': request.args.get(u'sort', None),
      u'extras': extras
  }

  item_count, results = ckan_feed._package_search(data_dict)

  navigation_urls = ckan_feed._navigation_urls(
        request.args,
        item_count=item_count,
        limit=data_dict['rows'],
        named_route='feeds.custom')

  feed_url = ckan_feed._feed_url(request.args,
                            named_route='feeds.custom')

  atom_url = h._url_with_params('/feeds/custom.atom',
                                list(search_params.items()))

  alternate_url = ckan_feed._alternate_url(request.args)

  site_title = config.get('ckan.site_title', 'CKAN')

  return ckan_feed.output_feed(results,
                          feed_title='%s - Custom query' % site_title,
                          feed_description='Recently created or updated'
                          ' datasets on %s. Custom query: \'%s\'' %
                          (site_title, q),
                          feed_link=alternate_url,
                          feed_guid=ckan_feed._create_atom_id(atom_url),
                          feed_url=feed_url,
                          navigation_urls=navigation_urls)