#!/usr/bin/python
"""Moves comic files based on metadata organizing in a tree by Publisher/Series (Volume)"""

# Copyright 2015 ComicTagger Authors

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import shutil

from comicapi.comicarchive import *
from comictaggerlib.settings import *

# import sys
# import os
# import platform


# from comicapi.issuestring import *
# import comicapi.utils


def make_folder(folder):
    if not os.path.exists(folder):
        try:
            os.makedirs(folder)
        except Exception as e:
            print "{0} Can't make {1} -- quitting".format(e, folder)
            quit()


def move_file(source, filename):
    if not os.path.exists(filename):
        shutil.move(os.path.abspath(source), filename)


def main():
    utils.fix_output_encoding()
    settings = ComicTaggerSettings()

    style = MetaDataStyle.CIX

    if platform.system() == "Windows":
        print >> sys.stderr, "Sorry, this script works only on UNIX systems"

    if len(sys.argv) < 3:
        print >> sys.stderr, "Usage: {0} [comic_root][tree_root]".format(sys.argv[0])
        return

    comic_root = sys.argv[1]
    tree_root = sys.argv[2]

    print "Root is:", comic_root
    if not os.path.exists(comic_root):
        print >> sys.stderr, "The comic root doesn't seem a directory or it doesn't exists. -- quitting"
        return

    filelist = utils.get_recursive_filelist([comic_root])

    if len(filelist) == 0:
        print >> sys.stderr, "The comic root seems empty. -- quitting"
        return

    make_folder(tree_root)

    # first find all comics with metadata
    print "Reading in all comics..."
    comic_list = []
    max_name_len = 2
    fmt_str = ""
    for filename in filelist:
        ca = ComicArchive(filename, settings.rar_exe_path, ComicTaggerSettings.getGraphic("nocover.png"))
        if ca.seemsToBeAComicArchive() and ca.hasMetadata(style):

            comic_list.append((filename, ca.readMetadata(style)))

            max_name_len = max(max_name_len, len(filename))
            fmt_str = u"{{0:{0}}}".format(max_name_len)
            print >> sys.stderr, fmt_str.format(filename) + "\r",
            sys.stderr.flush()

    print >> sys.stderr, fmt_str.format("")

    print "Found {0} tagged comics.".format(len(comic_list))

    # walk through the comic list and moves each one
    for filename, md in comic_list:
        print >> sys.stderr, fmt_str.format(filename) + "\r",
        sys.stderr.flush()

        # do publisher/series organizing:
        series_name = md.series
        publisher_name = md.publisher
        start_year = md.volume
        if series_name is not None:
            # some tweaks to keep various filesystems happy
            series_name = series_name.replace(":", " -")
            series_name = series_name.replace("/", "-")
            series_name = series_name.replace("?", "")
        series_folder = os.path.join(
            tree_root, unicode(publisher_name), unicode(series_name) + " (" + unicode(start_year) + ")"
        )
        make_folder(series_folder)
        move_file(filename, os.path.join(series_folder, os.path.basename(filename)))


if __name__ == "__main__":
    main()
