from pprint import pprint
from pathlib import Path

import numpy
from numpy import pi

import masque
from masque import Pattern, Ref, Arc, Library
from masque.repetition import Grid
from masque.file import gdsii, dxf, oasis



def main():
    lib = Library()

    cell_name = 'ellip_grating'
    pat = masque.Pattern()

    layer = (0, 0)
    for rmin in numpy.arange(10, 15, 0.5):
        pat.shapes[layer].append(Arc(
            radii=(rmin, rmin),
            width=0.1,
            angles=(0 * -pi/4, pi/4),
            annotations={'1': ['blah']},
            ))

    pat.scale_by(1000)
#    pat.visualize()
    lib[cell_name] = pat
    print(f'\nAdded {cell_name}:')
    pprint(pat.shapes)

    new_name = lib.get_name(cell_name)
    lib[new_name] = pat.copy()
    print(f'\nAdded a copy of {cell_name} as {new_name}')

    pat3 = Pattern()
    pat3.refs[cell_name] = [
        Ref(offset=(1e5, 3e5), annotations={'4': ['Hello I am the base Ref']}),
        Ref(offset=(2e5, 3e5), rotation=pi/3),
        Ref(offset=(3e5, 3e5), rotation=pi/2),
        Ref(offset=(4e5, 3e5), rotation=pi),
        Ref(offset=(5e5, 3e5), rotation=3*pi/2),
        Ref(mirrored=True, offset=(1e5, 4e5)),
        Ref(mirrored=True, offset=(2e5, 4e5), rotation=pi/3),
        Ref(mirrored=True, offset=(3e5, 4e5), rotation=pi/2),
        Ref(mirrored=True, offset=(4e5, 4e5), rotation=pi),
        Ref(mirrored=True, offset=(5e5, 4e5), rotation=3*pi/2),
        Ref(offset=(1e5, 5e5)).mirror_target(1),
        Ref(offset=(2e5, 5e5), rotation=pi/3).mirror_target(1),
        Ref(offset=(3e5, 5e5), rotation=pi/2).mirror_target(1),
        Ref(offset=(4e5, 5e5), rotation=pi).mirror_target(1),
        Ref(offset=(5e5, 5e5), rotation=3*pi/2).mirror_target(1),
        Ref(offset=(1e5, 6e5)).mirror2d_target(True, True),
        Ref(offset=(2e5, 6e5), rotation=pi/3).mirror2d_target(True, True),
        Ref(offset=(3e5, 6e5), rotation=pi/2).mirror2d_target(True, True),
        Ref(offset=(4e5, 6e5), rotation=pi).mirror2d_target(True, True),
        Ref(offset=(5e5, 6e5), rotation=3*pi/2).mirror2d_target(True, True),
        ]

    lib['sref_test'] = pat3
    print('\nAdded sref_test:')
    pprint(pat3)
    pprint(pat3.refs)

    rep = Grid(
        a_vector=[1e4, 0],
        b_vector=[0, 1.5e4],
        a_count=3,
        b_count=2,
        )
    pat4 = Pattern()
    pat4.refs[cell_name] = [
        Ref(repetition=rep, offset=(1e5, 3e5)),
        Ref(repetition=rep, offset=(2e5, 3e5), rotation=pi/3),
        Ref(repetition=rep, offset=(3e5, 3e5), rotation=pi/2),
        Ref(repetition=rep, offset=(4e5, 3e5), rotation=pi),
        Ref(repetition=rep, offset=(5e5, 3e5), rotation=3*pi/2),
        Ref(repetition=rep, mirrored=True, offset=(1e5, 4e5)),
        Ref(repetition=rep, mirrored=True, offset=(2e5, 4e5), rotation=pi/3),
        Ref(repetition=rep, mirrored=True, offset=(3e5, 4e5), rotation=pi/2),
        Ref(repetition=rep, mirrored=True, offset=(4e5, 4e5), rotation=pi),
        Ref(repetition=rep, mirrored=True, offset=(5e5, 4e5), rotation=3*pi/2),
        Ref(repetition=rep, offset=(1e5, 5e5)).mirror_target(1),
        Ref(repetition=rep, offset=(2e5, 5e5), rotation=pi/3).mirror_target(1),
        Ref(repetition=rep, offset=(3e5, 5e5), rotation=pi/2).mirror_target(1),
        Ref(repetition=rep, offset=(4e5, 5e5), rotation=pi).mirror_target(1),
        Ref(repetition=rep, offset=(5e5, 5e5), rotation=3*pi/2).mirror_target(1),
        Ref(repetition=rep, offset=(1e5, 6e5)).mirror2d_target(True, True),
        Ref(repetition=rep, offset=(2e5, 6e5), rotation=pi/3).mirror2d_target(True, True),
        Ref(repetition=rep, offset=(3e5, 6e5), rotation=pi/2).mirror2d_target(True, True),
        Ref(repetition=rep, offset=(4e5, 6e5), rotation=pi).mirror2d_target(True, True),
        Ref(repetition=rep, offset=(5e5, 6e5), rotation=3*pi/2).mirror2d_target(True, True),
        ]

    lib['aref_test'] = pat4
    print('\nAdded aref_test')

    folder = Path('./layouts/')
    folder.mkdir(exist_ok=True)
    print(f'...writing files to {folder}...')

    gds1 = folder / 'rep.gds.gz'
    gds2 = folder / 'rerep.gds.gz'
    print(f'Initial write to {gds1}')
    gdsii.writefile(lib, gds1, 1e-9, 1e-3)

    print(f'Read back and rewrite to {gds2}')
    readback_lib, _info = gdsii.readfile(gds1)
    gdsii.writefile(readback_lib, gds2, 1e-9, 1e-3)

    dxf1 = folder / 'rep.dxf.gz'
    dxf2 = folder / 'rerep.dxf.gz'
    print(f'Write aref_test to {dxf1}')
    dxf.writefile(lib, 'aref_test', dxf1)

    print(f'Read back and rewrite to {dxf2}')
    dxf_lib, _info = dxf.readfile(dxf1)
    print(Library(dxf_lib))
    dxf.writefile(dxf_lib, 'Model', dxf2)

    layer_map = {'base': (0,0), 'mylabel': (1,2)}
    oas1 = folder / 'rep.oas'
    oas2 = folder / 'rerep.oas'
    print(f'Write lib to {oas1}')
    oasis.writefile(lib, oas1, 1000, layer_map=layer_map)

    print(f'Read back and rewrite to {oas2}')
    oas_lib, oas_info = oasis.readfile(oas1)
    oasis.writefile(oas_lib, oas2, 1000, layer_map=layer_map)

    print('OASIS info:')
    pprint(oas_info)


if __name__ == '__main__':
    main()