import os

import autofit as af
from autolens.data.instrument import abstract_data
from autolens.data.instrument import ccd
from autolens.data.array import mask as msk
from autolens.pipeline import pipeline as pl

# Welcome to the pipeline runner. This tool allows you to load strong lens instrument, and pass it to pipelines for a
# PyAutoLens analysis. To show you around, we'll load up some example instrument and run it through some of the example
# pipelines that come distributed with PyAutoLens.

# The runner is supplied as both this Python script and a Juypter notebook. Its up to you which you use - I personally
# prefer the python script as provided you keep it relatively small, its quick and easy to comment out different lens
# names and pipelines to perform different analyses. However, notebooks are a tidier way to manage visualization - so
# feel free to use notebooks. Or, use both for a bit, and decide your favourite!

# The pipeline runner is fairly self explanatory. Make sure to checkout the pipelines in the
#  workspace/pipelines/examples/ folder - they come with detailed descriptions of what they do. I hope that you'll
# expand on them for your own personal scientific needs

# It is convenient to specify the instrument type and data name as a string, so that if the pipeline is applied to multiple
# images we don't have to change all of the path entries in the load_ccd_data_from_fits function below.

# Setup the path to the workspace, using a relative directory name.
workspace_path = "{}/../../".format(os.path.dirname(os.path.realpath(__file__)))
output_path = workspace_path + "../../outputs/PyAutoLens/"
af.conf.instance = af.conf.Config(
    config_path=workspace_path + "config", output_path=output_path
)

data_type = "rjlens"
data_name = "f814w"

pixel_scale = 0.04

# Create the path where the instrument will be loaded from, which in this case is
# '/workspace/data/example/lens_light_and_x1_source/'
data_path = af.path_util.make_and_return_path_from_path_and_folder_names(
    path=workspace_path, folder_names=["data", data_type, data_name]
)

ccd_data = ccd.load_ccd_data_from_fits(
    image_path=data_path + "image.fits",
    psf_path=data_path + "psf.fits",
    noise_map_path=data_path + "noise_map.fits",
    pixel_scale=pixel_scale,
    renormalize_psf=True,
    resized_ccd_shape=(251, 251),
    resized_psf_shape=(15, 15),
)

mask = msk.Mask.circular(
    shape=ccd_data.shape, pixel_scale=ccd_data.pixel_scale, radius_arcsec=3.7
)

positions = abstract_data.load_positions(positions_path=data_path + "positions.dat")

ccd_plotters.plot_ccd_subplot(ccd_data=ccd_data, mask=mask, positions=positions)

stop

# Running a pipeline is easy, we simply import it from the pipelines folder and pass the lens instrument to its run function.
# Below, we'll' use a 3 phase example pipeline to fit the instrument with a parametric lens light, mass and source light
# profile. Checkout 'workspace/pipelines/examples/lens_light_and_x1_source_parametric.py' for a full description of
# the pipeline.

# The phase folders input determines the output directory structure of the pipeline, for example the input below makes
# the directory structure:
# 'autolens_workspace/output/phase_folder_1/phase_folder_2/pipeline_name/' or
# 'autolens_workspace/output/example/lens_light_and_x1_source/lens_light_and_x1_source_parametric/'

# For large samples of images, we can therefore easily group lenses that are from the same sample or modeled using the
# same pipeline.

pipeline_settings = pl.PipelineSettings(include_shear=True, fix_lens_light=False)

from workspace_jam.pipelines.advanced.with_lens_light.sersic.initialize import (
    lens_sersic_sie__source_sersic,
)


pipeline_initialize = lens_sersic_sie__source_sersic.make_pipeline(
    pipeline_settings=pipeline_settings,
    phase_folders=[data_type, data_name],
    positions_threshold=0.5,
)

pipeline = pipeline_initialize
pipeline.run(data=ccd_data, mask=mask, positions=positions)
