# Copyright (c) OpenMMLab. All rights reserved.
import json
import os.path as osp
import tempfile

import numpy as np

from mmocr.datasets.text_det_dataset import TextDetDataset


def _create_dummy_ann_file(ann_file):
    ann_info1 = {
        'file_name':
        'sample1.jpg',
        'height':
        640,
        'width':
        640,
        'annotations': [{
            'iscrowd': 0,
            'category_id': 1,
            'bbox': [50, 70, 80, 100],
            'segmentation': [[50, 70, 80, 70, 80, 100, 50, 100]]
        }, {
            'iscrowd':
            1,
            'category_id':
            1,
            'bbox': [120, 140, 200, 200],
            'segmentation': [[120, 140, 200, 140, 200, 200, 120, 200]]
        }]
    }

    with open(ann_file, 'w') as fw:
        fw.write(json.dumps(ann_info1) + '\n')


def _create_dummy_loader():
    loader = dict(
        type='HardDiskLoader',
        repeat=1,
        parser=dict(
            type='LineJsonParser',
            keys=['file_name', 'height', 'width', 'annotations']))
    return loader


def test_detect_dataset():
    tmp_dir = tempfile.TemporaryDirectory()
    # create dummy data
    ann_file = osp.join(tmp_dir.name, 'fake_data.txt')
    _create_dummy_ann_file(ann_file)

    # test initialization
    loader = _create_dummy_loader()
    dataset = TextDetDataset(ann_file, loader, pipeline=[])

    # test _parse_ann_info
    img_ann_info = dataset.data_infos[0]
    ann = dataset._parse_anno_info(img_ann_info['annotations'])
    print(ann['bboxes'])
    assert np.allclose(ann['bboxes'], [[50., 70., 80., 100.]])
    assert np.allclose(ann['labels'], [1])
    assert np.allclose(ann['bboxes_ignore'], [[120, 140, 200, 200]])
    assert np.allclose(ann['masks'], [[[50, 70, 80, 70, 80, 100, 50, 100]]])
    assert np.allclose(ann['masks_ignore'],
                       [[[120, 140, 200, 140, 200, 200, 120, 200]]])

    tmp_dir.cleanup()

    # test prepare_train_img
    pipeline_results = dataset.prepare_train_img(0)
    assert np.allclose(pipeline_results['bbox_fields'], [])
    assert np.allclose(pipeline_results['mask_fields'], [])
    assert np.allclose(pipeline_results['seg_fields'], [])
    expect_img_info = {'filename': 'sample1.jpg', 'height': 640, 'width': 640}
    assert pipeline_results['img_info'] == expect_img_info

    # test evluation
    metrics = 'hmean-iou'
    results = [{'boundary_result': [[50, 70, 80, 70, 80, 100, 50, 100, 1]]}]
    eval_res = dataset.evaluate(results, metrics)

    assert eval_res['hmean-iou:hmean'] == 1
