import logging

from galaxy.datatypes import data
from galaxy.datatypes.binary import Cel  # noqa: F401
from galaxy.datatypes.data import get_file_peek
from galaxy.datatypes.metadata import MetadataElement
from galaxy.datatypes.sniff import (
    build_sniff_from_prefix,
    FilePrefix,
    get_headers
)

log = logging.getLogger(__name__)


class GenericMicroarrayFile(data.Text):
    """
    Abstract class for most of the microarray files.
    """
    MetadataElement(name="version_number", default="1.0", desc="Version number", readonly=True, visible=True,
                    optional=True, no_value="1.0")
    MetadataElement(name="file_format", default="ATF", desc="File format", readonly=True, visible=True,
                    optional=True, no_value="ATF")
    MetadataElement(name="number_of_optional_header_records", default=1, desc="Number of optional header records",
                    readonly=True, visible=True, optional=True, no_value=1)
    MetadataElement(name="number_of_data_columns", default=1, desc="Number of data columns",
                    readonly=True, visible=True,
                    optional=True, no_value=1)
    MetadataElement(name="file_type", default="GenePix", desc="File type",
                    readonly=True, visible=True,
                    optional=True, no_value="GenePix")
    MetadataElement(name="block_count", default=1, desc="Number of blocks described in the file",
                    readonly=True, visible=True,
                    optional=True, no_value=1)
    MetadataElement(name="block_type", default=0, desc="Type of block",
                    readonly=True, visible=True,
                    optional=True, no_value=0)

    def set_peek(self, dataset):
        if not dataset.dataset.purged:
            if dataset.metadata.block_count == 1:
                dataset.blurb = f"{dataset.metadata.file_type} {dataset.metadata.version_number}: Format {dataset.metadata.file_format}, 1 block, {dataset.metadata.number_of_optional_header_records} headers and {dataset.metadata.number_of_data_columns} columns"
            else:
                dataset.blurb = f"{dataset.metadata.file_type} {dataset.metadata.version_number}: Format {dataset.metadata.file_format}, {dataset.metadata.block_count} blocks, {dataset.metadata.number_of_optional_header_records} headers and {dataset.metadata.number_of_data_columns} columns"
            dataset.peek = get_file_peek(dataset.file_name)
        else:
            dataset.peek = 'file does not exist'
            dataset.blurb = 'file purged from disk'

    def get_mime(self):
        return 'text/plain'


@build_sniff_from_prefix
class Gal(GenericMicroarrayFile):
    """ Gal File format described at:
            http://mdc.custhelp.com/app/answers/detail/a_id/18883/#gal
    """

    edam_format = "format_3829"
    edam_data = "data_3110"
    file_ext = "gal"

    def sniff_prefix(self, file_prefix: FilePrefix):
        """
        Try to guess if the file is a Gal file.

        >>> from galaxy.datatypes.sniff import get_test_fname
        >>> fname = get_test_fname('test.gal')
        >>> Gal().sniff(fname)
        True
        >>> fname = get_test_fname('test.gpr')
        >>> Gal().sniff(fname)
        False
        """
        headers = get_headers(file_prefix, sep="\t", count=3)
        return "ATF" in headers[0][0] and "GenePix ArrayList" in headers[2][0]

    def set_meta(self, dataset, **kwd):
        """
        Set metadata for Gal file.
        """
        super().set_meta(dataset, **kwd)
        headers = get_headers(dataset.file_name, sep="\t", count=5)
        dataset.metadata.file_format = headers[0][0]
        dataset.metadata.version_number = headers[0][1]
        dataset.metadata.number_of_optional_header_records = int(headers[1][0])
        dataset.metadata.number_of_data_columns = int(headers[1][1])
        dataset.metadata.file_type = headers[2][0].strip().strip('"').split("=")[1]
        if "BlockCount" in headers[3][0]:
            dataset.metadata.block_count = int(headers[3][0].strip().strip('"').split("=")[1])
        if "BlockType" in headers[4][0]:
            dataset.metadata.block_type = int(headers[4][0].strip().strip('"').split("=")[1])


@build_sniff_from_prefix
class Gpr(GenericMicroarrayFile):
    """ Gpr File format described at:
            http://mdc.custhelp.com/app/answers/detail/a_id/18883/#gpr
    """

    edam_format = "format_3829"
    edam_data = "data_3110"
    file_ext = "gpr"

    def sniff_prefix(self, file_prefix: FilePrefix):
        """
        Try to guess if the file is a Gpr file.

        >>> from galaxy.datatypes.sniff import get_test_fname
        >>> fname = get_test_fname('test.gpr')
        >>> Gpr().sniff(fname)
        True
        >>> fname = get_test_fname('test.gal')
        >>> Gpr().sniff(fname)
        False
        """
        headers = get_headers(file_prefix, sep="\t", count=3)
        return "ATF" in headers[0][0] and "GenePix Results" in headers[2][0]

    def set_meta(self, dataset, **kwd):
        """
        Set metadata for Gpr file.
        """
        super().set_meta(dataset, **kwd)
        headers = get_headers(dataset.file_name, sep="\t", count=5)
        dataset.metadata.file_format = headers[0][0]
        dataset.metadata.version_number = headers[0][1]
        dataset.metadata.number_of_optional_header_records = int(headers[1][0])
        dataset.metadata.number_of_data_columns = int(headers[1][1])
        dataset.metadata.file_type = headers[2][0].strip().strip('"').split("=")[1]
