import os
from urllib.parse import quote, urlsplit, urlunsplit
import scrapy

class CrawlhubProxyMiddleware:
    def __init__(self):
        server = urlsplit(os.environ['PROXY_SERVER'])
        if server.scheme != 'http' or not server.hostname or server.username or server.password or server.query or server.fragment or server.path not in ('', '/'):
            raise ValueError('Use an HTTP proxy server URL without credentials, a path or a query.')
        user = quote(os.environ['PROXY_USERNAME'], safe='')
        password = quote(os.environ['PROXY_PASSWORD'], safe='')
        self.proxy = urlunsplit((server.scheme, f'{user}:{password}@{server.netloc}', '', '', ''))

    def process_request(self, request):
        # Include robots.txt and requests generated by callbacks.
        request.meta['proxy'] = self.proxy

class ProxyCheckSpider(scrapy.Spider):
    name = 'crawlhub_proxy_check'
    custom_settings = {
        'DOWNLOADER_MIDDLEWARES': {CrawlhubProxyMiddleware: 740},
        'CONCURRENT_REQUESTS': 1,
        'DOWNLOAD_TIMEOUT': 30,
        'DOWNLOAD_VERIFY_CERTIFICATES': True,
        'RETRY_TIMES': 1,
        'ROBOTSTXT_OBEY': True,
    }

    async def start(self):
        target = os.environ.get('TARGET_URL', 'https://example.com/')
        yield scrapy.Request(target, callback=self.parse)

    def parse(self, response):
        yield {
            'url': response.url,
            'status': response.status,
            'title': response.css('title::text').get(),
        }
