using Newtonsoft.Json;
using System;
using System.ComponentModel.DataAnnotations;
using ZeroD.Util;

namespace LifePayment.Domain.Shared;

/// <summary>
/// 公共请求参数基类 
/// </summary>
public class ACOOLYRequestBaseInput
{
    /// <summary>
    /// 请求号(16-40位)无需传入,系统自动生成
    /// </summary>
    [JsonProperty("requestNo")]
    public string RequestNo { get; set; }

    /// <summary>
    /// 商户ID(定长20字符)无需传入,读取配置
    /// </summary>
    [JsonProperty("partnerId")]
    public string PartnerId { get; set; }

    /// <summary>
    /// 服务名称(最大32字符) 无需传入
    /// </summary>
    [JsonProperty("service")]
    public string Service { get; set; }

    /// <summary>
    /// 服务版本(最大8字符)无需传入
    /// </summary>
    [JsonProperty("version")]
    public string Version { get; set; } = "1.0";

    /// <summary>
    /// 协议类型(默认HTTP/JSON)无需传入
    /// </summary>
    [JsonProperty("protocol")]
    public string Protocol { get; set; } = "HTTP/JSON";

    /// <summary>
    /// 会话参数(JSON格式)
    /// </summary>
    [StringLength(128, ErrorMessage = "会话参数最大128字符")]
    [JsonProperty("context")]
    public string Context { get; set; }

    /// <summary>
    /// 扩展参数(JSON单层结构)
    /// </summary>
    [StringLength(1024, ErrorMessage = "扩展参数最大1024字符")]
    [JsonProperty("ext")]
    public string Ext { get; set; }

    /// <summary>
    /// 页面跳转地址 
    /// </summary>
    [StringLength(128, ErrorMessage = "跳转地址最大128字符")]
    [Url(ErrorMessage = "非法的URL格式")]
    [JsonProperty("returnUrl")]
    public string ReturnUrl { get; set; }

    /// <summary>
    /// 异步通知地址 
    /// </summary>
    [StringLength(128, ErrorMessage = "通知地址最大128字符")]
    [Url(ErrorMessage = "非法的URL格式")]
    [JsonProperty("notifyUrl")]
    public string NotifyUrl { get; set; }
}

/// <summary>
/// 获取燃气面值请求参数
/// </summary>
public class GasParValueRequestInput : ACOOLYRequestBaseInput
{
    /// <summary>
    /// 天然气公司类型
    /// </summary>
    [JsonProperty("gasOrgType")]
    public string GasOrgType { get; set; }

}

public class GasOrgTypeRequestInput : ACOOLYRequestBaseInput
{
    /// <summary>
    /// 外部商户订单号
    /// </summary>
    [JsonProperty("outOrderNo")]
    public string OutOrderNo { get; set; }

    /// <summary>
    /// 平台订单号
    /// </summary>
    [JsonProperty("busiOrderNo")]
    public string BusiOrderNo { get; set; }
}

/// <summary>
/// 提交燃气订单请求参数
/// </summary>
public class ConfirmGasOrderRequestInput : ACOOLYRequestBaseInput
{
    /// <summary>
    /// 外部商户订单号
    /// </summary>
    [Required(ErrorMessage = "外部商户订单号不能为空")]
    [JsonProperty("outOrderNo")]
    public string OutOrderNo { get; set; }

    /// <summary>
    /// 充值面额
    /// </summary>
    [Required(ErrorMessage = "充值面额不能为空")]
    [Range(0.01, double.MaxValue, ErrorMessage = "充值面额必须大于0")]
    [JsonProperty("parValue")]
    public decimal ParValue { get; set; }

    /// <summary>
    /// 天然气公司类型
    /// </summary>
    [Required(ErrorMessage = "天然气公司类型不能为空")]
    [JsonProperty("gasOrgType")]
    public string GasOrgType { get; set; }

    /// <summary>
    /// 天然气号
    /// </summary>
    [Required(ErrorMessage = "天然气号不能为空")]
    [JsonProperty("gasAccount")]
    public string GasAccount { get; set; }

    /// <summary>
    /// 地区
    /// </summary>
    [JsonProperty("areaName")]
    public string AreaName { get; set; }
}

/// <summary>
/// 提交电费订单请求参数
/// </summary>
public class ConfirmElectricOrderRequestInput : ACOOLYRequestBaseInput
{
    /// <summary>
    /// 充值面额,单位为元。
    /// </summary>
    [Required(ErrorMessage = "充值面额是必填项。")]
    [JsonProperty("parValue")]
    public decimal ParValue { get; set; }

    /// <summary>
    /// 电网类型,例如:"guowang"代表国家电网,"nanwang"代表南方电网。
    /// </summary>
    [Required(ErrorMessage = "电网类型是必填项。")]
    [JsonProperty("electricType")]
    public string ElectricType { get; set; }

    /// <summary>
    /// 电费类型,国网必传:住宅、企事业、店铺三个选项。
    /// </summary>
    [Required(ErrorMessage = "电费类型是必填项。")]
    [StringLength(20, ErrorMessage = "电费类型长度不能超过20个字符。")]
    [JsonProperty("electricAccountType")]
    public string ElectricAccountType { get; set; }

    /// <summary>
    /// 电费户号。
    /// </summary>
    [Required(ErrorMessage = "电费户号是必填项。")]
    [StringLength(50, ErrorMessage = "电费户号长度不能超过50个字符。")]
    [JsonProperty("electricAccount")]
    public string ElectricAccount { get; set; }

    /// <summary>
    /// 省份。
    /// </summary>
    [Required(ErrorMessage = "省份是必填项。")]
    [StringLength(20, ErrorMessage = "省份长度不能超过20个字符。")]
    [JsonProperty("province")]
    public string Province { get; set; }

    /// <summary>
    /// 城市。
    /// </summary>
    [Required(ErrorMessage = "城市是必填项。")]
    [StringLength(20, ErrorMessage = "城市长度不能超过20个字符。")]
    [JsonProperty("city")]
    public string City { get; set; }

    /// <summary>
    /// 客户身份证后6位,南网必传。
    /// </summary>
    [JsonProperty("sixID")]
    public string SixID { get; set; }

    /// <summary>
    /// 订单号
    /// </summary>
    [JsonProperty("outOrderNo")]
    public string OutOrderNo { get; set; }
}

/// <summary>
/// 提交电话费订单请求参数
/// </summary>
public class ConfirmPhoneOrderRequestInput : ACOOLYRequestBaseInput
{
    /// <summary>
    /// 运营商编码,例如:"yidong", "dianxin", "liantong"。
    /// </summary>
    [Required(ErrorMessage = "运营商编码是必填项。")]
    [JsonProperty("ispCode")]
    public string IspCode { get; set; }

    /// <summary>
    /// 充值面额,单位为元。测试账户:parValue=100:缴费成功,parValue>100:缴费失败。
    /// </summary>
    [Required(ErrorMessage = "充值面额是必填项。")]
    [JsonProperty("parValue")]
    public decimal ParValue { get; set; }

    /// <summary>
    /// 手机号。
    /// </summary>
    [Required(ErrorMessage = "手机号是必填项。")]
    [JsonProperty("phone")]
    public string Phone { get; set; }

    /// <summary>
    /// 外部订单号
    /// </summary>
    [Required(ErrorMessage = "订单号是必填项。")]
    [JsonProperty("outOrderNo")]
    public string OutOrderNo { get; set; }

    /// <summary>
    /// 机主名称(电信手机号必填)
    /// </summary>
    [JsonProperty("name")]
    public string Name { get; set; }
}
public class ChannelsBaseInput : PageInput
{
    public string CheckChannelId { get; set; }
}

public class LogErrorInput
{
    public string Error { get; set; }
}
public class SetLifePayOrderPayTypeInput : ChannelsBaseInput
{
    [Required(ErrorMessage = "订单号不可为空")]
    public string OrderNo { get; set; }

    [EnumValidation(typeof(LifePayTypeEnum), ErrorMessage = "支付方式异常")]
    public LifePayTypeEnum LifePayType { get; set; }

    public string H5Type { get; set; }

    /// <summary>
    /// 支付OpenId
    /// </summary>
    public string OpenId { get; set; }

    /// <summary>
    /// 商户数据包
    /// </summary>
    public string Attach { get; set; }


}

public class GetPayOrderForJsAPIInput : ChannelsBaseInput
{
    [Required(ErrorMessage = "订单号不可为空")]
    public string OrderNo { get; set; }

    [EnumValidation(typeof(LifePayTypeEnum), ErrorMessage = "支付方式异常")]
    public LifePayTypeEnum LifePayType { get; set; }

    /// <summary>
    /// 支付OpenId
    /// </summary>
    public string OpenId { get; set; }

    /// <summary>
    /// 商户数据包
    /// </summary>
    public string Attach { get; set; }

    /// <summary>
    /// 支付应用的appId
    /// </summary>
    public string PayAppId { get; set; }

    //public string CheckChannelId { get; set; }

}