#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import logging
import os
from skypy.paths import Paths
import socket;
import subprocess
import sys
import urlparse


SUPPORTED_MIME_TYPES = [
    'text/html',
    'text/sky',
    'text/plain',
]


class SkyDebugger(object):
    def __init__(self):
        self._sky_server = None
        self.paths = Paths(os.path.join('out', 'Debug'))

    @staticmethod
    def _port_in_use(port):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        return sock.connect_ex(('localhost', port)) == 0

    def _start_http_server_for_file(self, path):
        HTTP_PORT = 9999


        path = os.path.abspath(path)
        if os.path.commonprefix([path, self.paths.src_root]) == self.paths.src_root:
            server_root = self.paths.src_root
        else:
            server_root = os.path.dirname(path)
            logging.warn(
                '%s is outside of mojo root, using %s as server root' %
                (path, server_root))
        relative_path = os.path.relpath(path, server_root)

        if self._port_in_use(HTTP_PORT):
            logging.warn(
                'Port %s already in use, assuming custom sky_server started.' %
                HTTP_PORT)
        else:
            server_command = [
                os.path.join(self.paths.sky_tools_directory, 'sky_server'),
                '--debug',
                server_root,
                str(HTTP_PORT),
            ]
            self._sky_server = subprocess.Popen(server_command)
        return 'http://localhost:%s/%s' % (HTTP_PORT, relative_path)

    def main(self):
        logging.basicConfig(level=logging.INFO)

        parser = argparse.ArgumentParser(description='Sky launcher/debugger')
        parser.add_argument('--gdb', action='store_true')
        parser.add_argument('--use-osmesa', action='store_true')
        parser.add_argument('url', nargs='?', type=str)
        args = parser.parse_args()

        content_handlers = ['%s,%s' % (mime_type, 'mojo:sky_viewer')
            for mime_type in SUPPORTED_MIME_TYPES]
        shell_command = [
            self.paths.mojo_shell_path,
            '--v=1',
            '--content-handlers=%s' % ','.join(content_handlers),
            '--url-mappings=mojo:window_manager=mojo:sky_debugger',
            'mojo:window_manager',
        ]
        if args.url:
            url = args.url
            if not urlparse.urlparse(url).scheme:
                url = self._start_http_server_for_file(url)

            prompt_args = '--args-for=mojo:sky_debugger_prompt %s' % url
            shell_command.append(prompt_args)
        if args.use_osmesa:
            shell_command.append('--args-for=mojo:native_viewport_service --use-osmesa')
        if args.gdb:
            shell_command = ['gdb', '--args'] + shell_command

        subprocess.check_call(shell_command)

    def shutdown(self):
        print "Quitting"
        if self._sky_server:
            self._sky_server.terminate()


if __name__ == '__main__':
    skydb = SkyDebugger()
    try:
        skydb.main()
    except (KeyboardInterrupt, SystemExit):
        pass
    finally:
        skydb.shutdown()
