using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

class SaveMissionConditionManager : SaveModelSystem<IndexValuePair<string, List<MissionConditionData>>> // TODO change MissionConditionData
{
    public override bool SaveModelItem(IndexValuePair<string, List<MissionConditionData>> model)
    {
        return base.SaveModelItem(model);
    }

    public override bool SaveModelList(List<IndexValuePair<string, List<MissionConditionData>>> list)
    {
        BinaryFormatter formatter = new BinaryFormatter();

        Debug.Log("Saved Mision Condition list at " + Path);

        if (!Directory.Exists(Path)) Directory.CreateDirectory(Path);

        /* Main logic of  conversion data format */
        var data = list; // ConvertObjectsListToListOfDataModels(list);

        FileStream stream = new FileStream(
            Path + GetFileName(ObjectListName),
            FileMode.Create
        );

        formatter.Serialize(stream, data);
        stream.Close();

        return true;
    }

    public override IndexValuePair<string, List<MissionConditionData>> LoadModelItem()
    {
        return base.LoadModelItem();
    }

    public override List<IndexValuePair<string, List<MissionConditionData>>> LoadModelList()
    {
        string path = Path + GetFileName(ObjectListName);

        if (File.Exists(path))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            FileStream stream = new FileStream(path, FileMode.Open);

            List<IndexValuePair<string, List<MissionConditionData>>> missionsList = formatter.Deserialize(stream) as List<IndexValuePair<string, List<MissionConditionData>>>;
            stream.Close();

            return missionsList; // ConvertListOfDataModelsToListOfObject(questsList);
        }
        else
        {
            Debug.Log("Save file not found in " + path);
        }

        return new List<IndexValuePair<string, List<MissionConditionData>>>();
    }

    // ----------------- USELLES IN THIS CLASS -----------------
    #region unused
    // Support function

    // 1. From model to data format

    public static MissionConditionData ConvertObjectToDataModel(MissionCondition model)
    {
        return MissionConditionData.Build(model);
    }

    public static List<IndexValuePair<string, List<MissionConditionData>>> ConvertObjectsListToListOfDataModels(List<IndexValuePair<string, List<MissionCondition>>> modelsList)
    {
        List<IndexValuePair<string, List<MissionConditionData>>> convertedList = new List<IndexValuePair<string, List<MissionConditionData>>>();

        foreach (IndexValuePair<string, List<MissionCondition>> dataModel in modelsList)
        {
            IndexValuePair<string, List<MissionConditionData>> conditionsForMapList = new IndexValuePair<string, List<MissionConditionData>>(dataModel.Key, new List<MissionConditionData>());

            foreach (MissionCondition condition in dataModel.Value)
            {
                conditionsForMapList.Value.Add(
                    ConvertObjectToDataModel(condition)
                );
            }

            convertedList.Add(conditionsForMapList);
        }

        return convertedList;
    }

    // 2. From data to model format
    public static MissionCondition ConvertDataModelToObject(MissionConditionData dataModel)
    {
        return dataModel.MapDataToObject();
    }

    public static List<IndexValuePair<string, List<MissionCondition>>> ConvertListOfDataModelsToListOfObject(List<IndexValuePair<string, List<MissionConditionData>>> dataModelsList)
    {
        List<IndexValuePair<string, List<MissionCondition>>> conditioncConvertedList = new List<IndexValuePair<string, List<MissionCondition>>>();

        foreach (IndexValuePair<string, List<MissionConditionData>> dataModel in dataModelsList)
        {
            IndexValuePair<string, List<MissionCondition>> conditionsForMapList = new IndexValuePair<string, List<MissionCondition>>(dataModel.Key, new List<MissionCondition>());

            foreach (MissionConditionData condition in dataModel.Value)
            {
                conditionsForMapList.Value.Add(
                    ConvertDataModelToObject(condition)
                );
            }

            conditioncConvertedList.Add(conditionsForMapList);
        }

        return conditioncConvertedList;
    }
    #endregion
}