﻿using Composite.Core.Routing;
using Composite.Core.Types;
using Composite.Data;
using System;
using System.Linq;

namespace Composite.Demo
{
    public class NewsDataMapper : IDataUrlMapper
    {
        private readonly Guid _pageId;
        private readonly Type _dataType;
        private readonly Type _keyType;

        public NewsDataMapper(Type dataType, Guid pageId)
        {
            _pageId = pageId;
            _dataType = dataType;
            _keyType = _dataType.GetKeyProperties().Single().PropertyType;
        }

        public IDataReference GetData(PageUrlData pageUrlData)
        {
            if (pageUrlData.PageId != _pageId)
            {
                return null;
            }

            string pathInfo = pageUrlData.PathInfo;

            if (string.IsNullOrEmpty(pathInfo) || pathInfo.Length == 1)
            {
                return null;
            }

            string[] parts = pathInfo.Split('/');

            if (parts.Length != 2 || string.IsNullOrEmpty(parts[1]))
            {
                return null;
            }

            string keyString = parts[1];

            object keyValue = ValueTypeConverter.Convert(keyString, _keyType);

            var data = keyValue != null ? DataFacade.TryGetDataByUniqueKey(_dataType, keyValue) : null;

            return data != null ? data.ToDataReference() : null;
        }

        public PageUrlData GetPageUrlData(IDataReference instance)
        {
            if (instance.ReferencedType != _dataType)
            {
                return null;
            }

            var page = PageManager.GetPageById(_pageId);

            if (page == null)
            {
                return null;
            }

            var key = instance.KeyValue;

            return new PageUrlData(page) { PathInfo = "/" + key };
        }

    }
}
