/*
 * Copyright (C) 2015-present, Ant Financial Services Group
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 	http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alipay.hulu.fragment;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import com.alibaba.fastjson.JSONObject;
import com.alipay.hulu.R;
import com.alipay.hulu.activity.CaseParamEditActivity;
import com.alipay.hulu.bean.AdvanceCaseSetting;
import com.alipay.hulu.bean.CaseParamBean;
import com.alipay.hulu.bean.CaseRunningParam;
import com.alipay.hulu.common.utils.LogUtil;
import com.alipay.hulu.common.utils.StringUtil;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by qiaoruikai on 2019-08-19 23:37.
 */
public class CaseParamSeparateFragment extends CaseParamEditActivity.CaseParamFragment {
    private static final String TAG = "CaseParamSeparateFragment";
    private ListView paramList;

    // 用例参数设置
    private List<CaseParamBean> presetParams;
    private List<ParamHolder> holders;
    private CaseRunningParam runningParam;
    private Map<String, String> storedParams;
    private ParamHolder waitingHolder;

    /**
     * 设置高级设置
     *
     * @param advanceCaseSetting
     */
    @Override
    public void setAdvanceCaseSetting(@NonNull AdvanceCaseSetting advanceCaseSetting) {
        storedParams = new LinkedHashMap<>();
        presetParams = advanceCaseSetting.getParams();
        runningParam = advanceCaseSetting.getRunningParam();
        if (runningParam == null) {
            runningParam = new CaseRunningParam();
        }

        // 如果之前有存储p
        if (runningParam.getMode() == CaseRunningParam.ParamMode.SEPARATE) {
            List<JSONObject> params = runningParam.getParamList();
            if (params != null) {
                for (JSONObject obj: params) {
                    for (String key: obj.keySet()) {
                        storedParams.put(key, obj.getString(key));
                    }
                }
            }
        }
    }

    @Override
    public CaseRunningParam getRunningParam() {
        int count = paramList.getCount();
        List<JSONObject> params = new ArrayList<>(count + 1);
        for (String key: storedParams.keySet()) {
            JSONObject paramInfo = new JSONObject(2);
            paramInfo.put(key, storedParams.get(key));
            params.add(paramInfo);
        }
        LogUtil.d(TAG,"message:" + params);

        runningParam.setMode(CaseRunningParam.ParamMode.SEPARATE);
        runningParam.setParamList(params);
        return runningParam;
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.dialog_param_edit, container, false);
        paramList = (ListView) root.findViewById(R.id.dialog_param_list);

        return root;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if (presetParams != null) {
            holders = new ArrayList<>(presetParams.size() + 1);
            for (CaseParamBean param : presetParams) {
                ParamHolder holder = new ParamHolder();
                holder.param = param;
                holders.add(holder);
            }

            final LayoutInflater inflater = LayoutInflater.from(getActivity());

            paramList.setAdapter(new BaseAdapter() {
                @Override
                public int getCount() {
                    return holders.size();
                }

                @Override
                public Object getItem(int position) {
                    return holders.get(position);
                }

                @Override
                public long getItemId(int position) {
                    return position;
                }

                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    if (convertView == null) {
                        convertView = inflater.inflate(R.layout.item_case_step_edit_input, parent, false);
                        convertView.findViewById(R.id.item_case_step_create_param).setVisibility(View.GONE);
                    }
                    TextView title = (TextView) convertView.findViewById(R.id.item_case_step_name);
                    final EditText edit = (EditText) convertView.findViewById(R.id.item_case_step_edit);

                    // 移除旧的textWatcher
                    TextWatcher oldTextWatcher = (TextWatcher) edit.getTag();
                    if (oldTextWatcher != null) {
                        edit.removeTextChangedListener(oldTextWatcher);
                    }

                    final ParamHolder holder = (ParamHolder) getItem(position);
                    final CaseParamBean paramBean = holder.param;
                    String desc = StringUtil.isEmpty(paramBean.getParamDesc()) ? paramBean.getParamName() : paramBean.getParamDesc();

                    String defaultValue = storedParams.get(paramBean.getParamName());
                    if (defaultValue == null) {
                        defaultValue = "";
                    }
                    edit.setText(defaultValue);
                    TextWatcher textWatcher = new TextWatcher() {
                        @Override
                        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                        }

                        @Override
                        public void onTextChanged(CharSequence s, int start, int before, int count) {
                            storedParams.put(paramBean.getParamName(), s.toString());
                        }

                        @Override
                        public void afterTextChanged(Editable s) {

                        }
                    };
                    edit.setTag(textWatcher);
                    edit.addTextChangedListener(textWatcher);

                    title.setText(desc);

                    return convertView;
                }
            });
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        LogUtil.d(TAG, "On activity result: %d, %d, %s", requestCode, resultCode, data);
    }

    private static class ParamHolder {
        private CaseParamBean param;
    }
}