# -*- coding: utf-8 -*-
import logging
import os
import zipfile

import ox

logger = logging.getLogger(__name__)
IMAGE_EXTENSIONS = ['.jpg', '.png', '.gif']


def filter_images(files):
    return [f for f in files if os.path.splitext(f)[-1].lower() in IMAGE_EXTENSIONS]

def detect_format(path):
    with open(path, 'rb') as fd:
        head = fd.read(10)
    if head[:2] == b'PK':
        return 'cbz'
    if head[:3] == b'Rar':
        return 'cbr'
    logger.debug('unknown cbr/cbz file %s - %s', head, path)
    return 'unknown'

def cover(path):
    format = detect_format(path)
    if format == 'cbz':
        cover = cover_cbz(path)
    elif format == 'cbr':
        cover = cover_cbr(path)
    else:
        cover = None
    return cover

def cover_cbr(path):
    data = None
    try:
        from unrar import rarfile
        rar = rarfile.RarFile(path)
        files = rar.namelist()
        files = filter_images(files)
        if files:
            cover = ox.sorted_strings(files)[0]
            data = rar.read(cover)
    except:
        logger.debug('invalid cbr file %s', path)
        data = None
    return data

def cover_cbz(path):
    data = None
    logger.debug('cover %s', path)
    data = None
    try:
        z = zipfile.ZipFile(path)
    except zipfile.BadZipFile:
        logger.debug('invalid cbz file %s', path)
        return data
    files = [f.filename for f in z.filelist]
    files = filter_images(files)
    if files:
        cover = ox.sorted_strings(files)[0]
        try:
            data = z.read(cover)
        except:
            data = None
    return data

def get_pages(path):
    files = []
    format = detect_format(path)
    if format == 'cbz':
        try:
            z = zipfile.ZipFile(path)
        except zipfile.BadZipFile:
            logger.debug('invalid cbz file %s', path)
            return data
        files = [f.filename for f in z.filelist]
    elif format == 'cbr':
        try:
            from unrar import rarfile
            rar = rarfile.RarFile(path)
            files = rar.namelist()
        except:
            pass
    files = filter_images(files)
    return len(files)


def info(path):
    data = {}
    data['title'] = os.path.splitext(os.path.basename(path))[0]
    data['pages'] = get_pages(path)
    return data